This is my implementation of the stack data type in C language. It is static meaning it does not grow in size. Any suggestions or feedback would be much appreciated.
#include <stdio.h>
#define MAXSTACKLENGTH 6
#define true 1
#define false 0
struct stk{
char content[MAXSTACKLENGTH];
int top;
};
typedef struct stk stack;
int size(stack *s)
{
return s->top;
}
int isEmpty(stack *s)
{
if (size(s) <= -1)
{
return true;
}
else if (size(s) > -1)
{
return false;
}
}
int isFull(stack *s) {
if (size(s) == (MAXSTACKLENGTH-1))
{
return true;
}
else {
return false;
}
}
char peek(stack *s)
{
if (isEmpty(s) == true)
{
printf("Can't peek: Stack is empty!\n");
return '\0';
}
else {
return s->content[s->top];
}
}
void push(stack *s, char element)
{
if (isFull(s) == true)
{
printf("Cant push: Stack is full!\n");
}
else {
s->top++;
s->content[s->top] = element;
}
}
void pop(stack *s)
{
if (isEmpty(s) == true) {
printf("Cant pop: Stack is empty!\n");
}
else {
s->top--;
}
}
void input_push(stack *s)
{
char c;
printf("Enter a character> ");
scanf(" %c", &c);
push(s, c);
}
void print_stack(stack *s)
{
if (isEmpty(s)) {
printf("Stack is empty!\n");
}
else {
int i = s->top;
for (i; i > -1; i--)
{
printf("%c\n", s->content[i]);
}
printf("\n");
}
}
void pause()
{
char c;
printf("Enter any character to continue.\n");
scanf(" %c", &c);
}
int main()
{
printf("SimpleStack! v1\n");
stack mystack;
mystack.top = -1; //Empty
int run = true;
int choice = 0;
while (run)
{
if (isFull(&mystack))
{
printf("Warning -> Stack is full\n");
}
if (isEmpty(&mystack))
{
printf("Warning -> Stack is empty\n");
}
printf("1 -> Push\n");
printf("2 -> Pop\n");
printf("3 -> Peek\n");
printf("4 -> Print Stack\n");
printf("5 -> Exit\n");
printf("Enter choice> ");
scanf("%d", &choice);
switch (choice) {
case 1:
input_push(&mystack);
break;
case 2:
pop(&mystack);
break;
case 3:
printf("%c\n", peek(&mystack));
pause();
break;
case 4:
print_stack(&mystack);
pause();
break;
case 5:
printf("Goodbye!\n");
run = false;
break;
default:
printf("Invalid choice.\n");
break;
}
system("clear");
}
return 0;
}