顺序栈
顺序栈是一种受到限制的顺序表,数据只能从栈顶压入,先进后出原则,遵从栈的逻辑。
构造顺序栈
使用结构体来构造顺序栈,其中stack是用来存储数据的,size是用来指明数据的个数,top是用来指明栈顶的位置。
typedef struct seqlist_stack{
int *stack;
int size;
int top;
}my_seqlist_stack,*p_seqlist_stack;
初始化
p_seqlist_stack init_list(int size)
{
p_seqlist_stack new_list = calloc(1, sizeof(my_seqlist_stack));
new_list->stack = calloc(size, sizeof(int));
new_list->size = size;
new_list->top = 0;
if (NULL == new_list)
return NULL;
return new_list;
}
注意:
需要给结构体成员*stack分配一个空间。
压栈
int input_msg(char * msg)
{
// 让用户输入新的数据
int num ;
printf("%s:" , msg);
scanf("%d" , &num);
while(getchar() != '
');
return num;
}
bool push_stack(p_seqlist_stack list)
{
if (list->top > list->size)
{
printf("栈满,压栈失败!!!
");
return false;
}
int data = input_msg("输入数据,压栈");
list->stack[list->top++] = data;
return true;
}
注意:
需要判断栈是否满了,满了数据会存储不下。
出栈
int pop_stack(p_seqlist_stack list)
{
if (0 == list->top)
{
printf("出栈失败,栈是空的
");
return -1;
}
int tmp = list->stack[list->top-1];
list->top--;
return tmp;
}
注意:
1.需要判断栈中是否还有数据;
2.list->top需要先减1才能取数据,不然数据将错位,并且少一个。
测试程序
int test()
{
p_seqlist_stack list = NULL;
int size;
list = init_list(10);
if(NULL == list)
return false;
push_stack(list);
push_stack(list);
push_stack(list);
push_stack(list);
push_stack(list);
for (int i = 0; i < 5; i++)
{
int data = pop_stack(list);
printf("data:%d
", data);
}
return 0;
}