COMP1511 17s1 Code Examples from Lectures on stacks_and_queues Introduction to Programming
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 "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;
}

#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;
}