typedef struct stack *stack_t; stack_t stack_create(void); // create a new stack void stack_free(stack_t stack); // free a stack void stack_push(stack_t stack, int item); // add new item to stack int stack_pop(stack_t stack); // remove top item from stack and return it int stack_is_empty(stack_t stack); // return true if stack is empty int stack_top(stack_t stack); // return top item from stack but don't remove it int stack_size(stack_t stack); // return number elements in stack
#include <stdio.h> #include <stdlib.h> #include "stack.h" #define MAX 2048 struct stack { int elements[MAX]; int top; }; // create a new stack stack_t stack_create(void) { struct stack *s = malloc(sizeof *s); if (s == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); } s->top = 0; return s; } // add new item to stack void stack_push(stack_t stack, int item) { if (stack->top == MAX) { fprintf(stderr, "push() exceeds maximum stack size %d\n", MAX); exit(1); } stack->elements[stack->top] = item; stack->top++; } // remove top item from stack and return it int stack_pop(stack_t stack) { if (stack_is_empty(stack)) { fprintf(stderr, "pop() of empty stack\n"); exit(1); } return stack->elements[--stack->top]; } // return true if stack is empty int stack_is_empty(stack_t stack) { return stack->top == 0; } // return top item from stack but don't remove it int stack_top(stack_t stack) { if (stack_is_empty(stack)) { fprintf(stderr, "top() of empty stack\n"); exit(1); } return stack->elements[stack->top-1]; } // return number elements in stack int stack_size(stack_t stack) { return stack->top; } // free a stack void stack_free(stack_t stack) { free(stack); }
#include <stdio.h> #include <stdlib.h> #include "stack.h" struct node { int data; struct node *next; }; struct stack { struct node *top; }; // create a new stack stack_t stack_create(void) { struct stack *s = malloc(sizeof *s); if (s == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); } s->top = NULL; return s; } // add new item to stack void stack_push(stack_t stack, int item) { struct node *n = malloc(sizeof *n); n->data = item; n->next = stack->top; stack->top = n; } // remove top item from stack and return it int stack_pop(stack_t stack) { int i; struct node *n; if (stack_is_empty(stack)) { fprintf(stderr, "pop() of empty stack\n"); exit(1); } n = stack->top; i = n->data; stack->top = stack->top->next; free(n); return i; } // return true if stack is empty int stack_is_empty(stack_t stack) { return stack->top == NULL; } // return top item from stack but don't remove it int stack_top(stack_t stack) { if (stack_is_empty(stack)) { fprintf(stderr, "top() of empty stack\n"); exit(1); } return stack->top->data; } // return number elements in stack int stack_size(stack_t stack) { int i = 0; struct node *n = stack->top; while (n != NULL) { i++; n = n->next; } return i; } // free a stack void stack_free(stack_t stack) { while (!stack_is_empty(stack)) { stack_pop(stack); } free(stack); }
#include <stdio.h> #include <stdlib.h> #include "stack.h" #define INITIAL_STACK_SIZE 1024 struct stack { int *elements; int size; int top; }; // create a new stack stack_t stack_create(void) { struct stack *s = malloc(sizeof *s); if (s == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); } s->size = INITIAL_STACK_SIZE; s->elements = malloc(s->size * sizeof s->elements[0]); if (s->elements == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); } s->top = 0; return s; } // add new item to stack void stack_push(stack_t stack, int item) { if (stack->top == stack->size) { stack->size = stack->size * 2; stack->elements = realloc(stack->elements, stack->size * sizeof stack->elements[0]); if (stack->elements == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); } } stack->elements[stack->top] = item; stack->top++; } // remove top item from stack and return it int stack_pop(stack_t stack) { if (stack_is_empty(stack)) { fprintf(stderr, "pop() of empty stack\n"); exit(1); } return stack->elements[--stack->top]; } // return true if stack is empty int stack_is_empty(stack_t stack) { return stack->top == 0; } // return top item from stack but don't remove it int stack_top(stack_t stack) { if (stack_is_empty(stack)) { fprintf(stderr, "top() of empty stack\n"); exit(1); } return stack->elements[stack->top-1]; } // return number elements in stack int stack_size(stack_t stack) { return stack->top; } // free a stack void stack_free(stack_t stack) { free(stack->elements); free(stack); }
typedef struct queue *queue_t; queue_t queue_create(void); // create a new queue void queue_free(queue_t queue); // free a queue void queue_enqueue(queue_t queue, int item); // add new item to queue int queue_dequeue(queue_t queue); // remove next item from queue and return it int queue_is_empty(queue_t queue); // return true if queue is empty int queue_front(queue_t queue); // return next item from queue but don't remove it int queue_size(queue_t queue); // return number elements in queue
#include <stdio.h> #include <stdlib.h> #include "queue.h" int main(void) { queue_t q; q = queue_create(); queue_enqueue(q, 10); queue_enqueue(q, 11); queue_enqueue(q, 12); printf("%d\n", queue_size(q)); // prints 3 printf("%d\n", queue_front(q)); // prints 10 printf("%d\n", queue_dequeue(q)); // prints 10 printf("%d\n", queue_dequeue(q)); // prints 11 printf("%d\n", queue_dequeue(q)); // prints 12 return 0; }
#include <stdio.h> #include <stdlib.h> #include "stack.h" int main(void) { stack_t s; s = stack_create(); stack_push(s, 10); stack_push(s, 11); stack_push(s, 12); printf("%d\n", stack_size(s)); // prints 3 printf("%d\n", stack_top(s)); // prints 12 printf("%d\n", stack_pop(s)); // prints 12 printf("%d\n", stack_pop(s)); // prints 11 printf("%d\n", stack_pop(s)); // prints 10 return 0; }