CPallini
Я хотел бы использовать struct
для maintining: массив значений, размер массива (то есть количество доступных слотов стека) и текущая вершина стека.
typedef struct _Stack
{
int * value; // the array of values
int SLOTS; // the number of available slots
int top; // the current top of the stack
} Stack;
Более того я бы разделил твою
push
работа в
create
один и настоящий
push
один (то есть
вставить один пункт).
Попробуйте, например (обратите внимание, что код просто утверждает об условиях ошибки, в зависимости от ваших потребностей, вы можете использовать более сложную обработку ошибок)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct _Stack
{
int * value;
int SLOTS;
int top;
} Stack;
Stack * create(int SLOTS);
void destroy(Stack * stack);
void push (Stack * stack, int i);
int pop (Stack * stack);
void display(Stack * stack);
int main()
{
int choice = 0;
Stack * stack = NULL;
do
{
printf("1.Create\n2.Push\n3.Pop\n4.Display\n5.Exit\n");
printf("Please, enter your choice\n");
if ( scanf("%d", &choice) == 1)
{
switch (choice)
{
case 1:
{
int SLOTS;
printf("Please enter the number of slots\n");
if ( scanf("%d", &SLOTS) == 1)
{
stack = create( SLOTS );
}
}
break;
case 2:
{
int i;
printf("Please enter the value to push\n");
if ( scanf("%d", &i) == 1)
{
push(stack, i);
}
}
break;
case 3:
{
int i = pop(stack);
printf("Popped value is %d\n", i);
}
break;
case 4:
printf("Stack content is\n");
display(stack);
break;
case 5:
default:
break;
}
}
} while ( choice != 5);
if ( stack ) destroy( stack );
return 0;
}
Stack * create( int SLOTS )
{
assert(SLOTS > 0);
Stack * stack = (Stack * ) malloc(sizeof(Stack));
assert(stack);
stack->value = (int *) malloc(sizeof(int) * SLOTS);
if ( ! stack->value )
{
free(stack);
assert(0);
}
stack->SLOTS = SLOTS;
stack->top = 0;
return stack;
}
void push(Stack * stack, int i)
{
assert( stack && stack->top < stack->SLOTS);
stack->value[stack->top] = i;
++stack->top;
}
int pop(Stack * stack)
{
assert(stack && stack->top > 0);
--stack->top;
return stack->value[stack->top];
}
void destroy( Stack * stack )
{
assert(stack);
free(stack->value);
free(stack);
}
void display(Stack * stack)
{
assert(stack);
int n;
for (n=0; n<stack->top; ++n)
{
printf("stack[%d] = %d\n", n, stack->value[n]);
}
}