Skip to content
Snippets Groups Projects
Commit 43202778 authored by Oscar Amaya Mohr's avatar Oscar Amaya Mohr
Browse files

Replace stack.c

parent 4e3b6aa9
No related merge requests found
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
...@@ -12,37 +9,25 @@ void die(char* msg) { ...@@ -12,37 +9,25 @@ void die(char* msg) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
/* *** Strukturen *********************************************************** */
/**@brief Struktur des Stacks.
*/
typedef struct { typedef struct {
size_t size; size_t size;
size_t capacity; size_t capacity;
int* data; int* data;
} IntStack; } IntStack;
/* *** öffentliche Schnittstelle ******************************************** */
/**@brief Initialisiert einen neuen Stack.
* @param self der zu initialisierende Stack
* @return 0, falls keine Fehler bei der Initialisierung aufgetreten sind,
* != 0, ansonsten
*/
int stackInit(IntStack *self) { int stackInit(IntStack *self) {
self->size = 0; self->size = 0;
self->capacity = INTSTACK_INIT_CAPACITY; self->capacity = INTSTACK_INIT_CAPACITY;
self->data = malloc(self->capacity * sizeof(int)); self->data = malloc(self->capacity * sizeof(int));
return self->data ? 0 : -1; return self->data ? 0 : -1;
} }
/**@brief Gibt den Stack und alle assoziierten Strukturen frei. // NOTE: Caller frees IntStack*, since in test there are automatic
* NOTE: Caller frees IntStack*, since in test there are automatic // storage duration non malloc'ed unfreeable IntStacks
* storage duration non malloc'ed unfreeable IntStacks
* @param self der Stack
*/
void stackRelease(IntStack *self) { void stackRelease(IntStack *self) {
free(self->data); if (self)
free(self->data);
} }
void stackResize(IntStack *self, size_t new_capacity) { void stackResize(IntStack *self, size_t new_capacity) {
...@@ -50,12 +35,8 @@ void stackResize(IntStack *self, size_t new_capacity) { ...@@ -50,12 +35,8 @@ void stackResize(IntStack *self, size_t new_capacity) {
self->data = realloc(self->data, self->capacity * sizeof(int)); self->data = realloc(self->data, self->capacity * sizeof(int));
} }
/**@brief Legt einen Wert auf den intstack.
* @param self der intstack
* @param i der Wert
*/
void stackPush(IntStack *self, int i) { void stackPush(IntStack *self, int i) {
self->size++; self->size += 1;
if (self->size >= self->capacity) if (self->size >= self->capacity)
stackResize(self, 2 * self->capacity); stackResize(self, 2 * self->capacity);
...@@ -63,10 +44,6 @@ void stackPush(IntStack *self, int i) { ...@@ -63,10 +44,6 @@ void stackPush(IntStack *self, int i) {
self->data[self->size - 1] = i; self->data[self->size - 1] = i;
} }
/**@brief Gibt das oberste Element des Stacks zurück.
* @param self der Stack
* @return das oberste Element
*/
int stackTop(const IntStack *self) { int stackTop(const IntStack *self) {
if (!self->size) { if (!self->size) {
stackRelease((IntStack *) self); stackRelease((IntStack *) self);
...@@ -76,10 +53,6 @@ int stackTop(const IntStack *self) { ...@@ -76,10 +53,6 @@ int stackTop(const IntStack *self) {
return self->data[self->size - 1]; return self->data[self->size - 1];
} }
/**@brief Entfernt und liefert das oberste Element des Stacks.
* @param self der Stack
* @return das oberste Element
*/
int stackPop(IntStack *self) { int stackPop(IntStack *self) {
if (!self->size) { if (!self->size) {
stackRelease(self); stackRelease(self);
...@@ -94,29 +67,19 @@ int stackPop(IntStack *self) { ...@@ -94,29 +67,19 @@ int stackPop(IntStack *self) {
return self->data[self->size]; return self->data[self->size];
} }
/**@brief Gibt zurück, ob der Stack leer ist.
* @param self der Stack
* @return 0, falls nicht leer,
!= 0, falls leer
*/
int stackIsEmpty(const IntStack *self) { int stackIsEmpty(const IntStack *self) {
return self->size == 0; return self->size == 0;
} }
/**@brief Gibt den Inhalt des Stacks beginnend mit dem obersten Element auf der
* Standardausgabe aus.
* @param self der Stack
*/
void stackPrint(const IntStack *self) { void stackPrint(const IntStack *self) {
printf("top("); printf("top(");
for (int i = (int) self->size - 1; i > 0; i--) if (self->size) {
printf("%d, ", self->data[i]); for (size_t i = self->size - 1; i > 0; i--)
printf("%d, ", self->data[i]);
if (self->size > 0)
printf("%d", self->data[0]); printf("%d", self->data[0]);
}
printf(")bot\n"); printf(")bot\n");
} }
#endif /* STACK_H_INCLUDED */
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment