TheAlgorithms-C/data_structures/stack.c
Anup Kumar Panwar 444d4b11d5 Refactor
2018-10-08 21:18:35 +05:30

145 lines
2.8 KiB
C

/**
* Kyler Smith, 2017
* Stack data structure implementation.
*/
////////////////////////////////////////////////////////////////////////////////
//INCLUDES
#include <stdio.h>
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////////////
//MACROS: CONSTANTS
////////////////////////////////////////////////////////////////////////////////
//DATA STRUCTURES
struct node {
int data;
struct node* next;
struct node* pre;
} *head, *tmp;
////////////////////////////////////////////////////////////////////////////////
//GLOBAL VARIABLES
int count = 0;
////////////////////////////////////////////////////////////////////////////////
//FUNCTION PROTOTYPES
void create();
void push(int x);
int pop();
int peek();
int size();
int isEmpty();
////////////////////////////////////////////////////////////////////////////////
//MAIN ENTRY POINT
int main(int argc, char const *argv[]) {
int x, y, z;
create();
push(4);
x = pop();
// 4. Count: 0. Empty: 1.
printf("%d.\t\tCount: %d.\tEmpty: %d.\n", x, size(), isEmpty());
push(1);
push(2);
push(3);
x = pop();
y = pop();
// 3, 2. Count: 1. Empty: 0;
printf("%d, %d.\t\tCount: %d.\tEmpty: %d.\n", x, y, size(), isEmpty());
pop(); // Empty the stack.
push(5);
push(6);
x = peek();
push(7);
y = pop();
push(8);
z = pop();
// 1, 6, 7, 8. Count: 2. Empty: 0.
printf("%d, %d, %d.\tCount: %d.\tEmpty: %d.\n", x, y, z, size(), isEmpty());
return 0;
}
/**
* Initialize the stack to NULL.
*/
void create() {
head = NULL;
}
/**
* Push data onto the stack.
*/
void push(int x) {
if(head == NULL) {
head = (struct node *)malloc(1 * sizeof(struct node));
head->next = NULL;
head->pre = NULL;
head->data = x;
} else {
tmp = (struct node *)malloc(1 * sizeof(struct node));
tmp->data = x;
tmp->next = NULL;
tmp->pre = head;
head = tmp;
}
++count;
}
/**
* Pop data from the stack
*/
int pop() {
int returnData;
if(head == NULL) {
printf("ERROR: Pop from empty stack.\n");
exit(1);
} else {
returnData = head->data;
if(head->pre == NULL)
head = NULL;
else {
head = head->pre;
free(head->next);
}
}
--count;
return returnData;
}
/**
* Returns the next value to be popped.
*/
int peek() {
if(head != NULL)
return head->data;
else {
printf("ERROR: Peeking from empty stack.");
exit(1);
}
}
/**
* Returns the size of the stack.
*/
int size() {
return count;
}
/**
* Returns 1 if stack is empty, returns 0 if not empty.
*/
int isEmpty() {
if(count == 0)
return 1;
return 0;
}