栈:是一种特殊的线性表,其只允许在表尾进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈 / 压栈 / 入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
顺序栈结构体定义
typedef struct
{
int data[MAX_SIZE];//数组顺序栈
int top;//栈顶指针
}seqstack_t;//顺序栈的结构体
顺序栈初始化
//顺序栈的初始化
seqstack_t* seqstack_init()
{
seqstack_t* s = (seqstack_t*)malloc(sizeof(seqstack_t));//申请一块顺序栈大小的内存
memset(s->data,0,sizeof(s->data));
s->top = -1;//栈顶指针
return s;
}
判断栈是否已满
//判断栈是否已满
int stack_isfull(seqstack_t* s)
{
return(s->top == MAX_SIZE - 1);//如果栈顶指针等于最大长度减一 那说明栈顶指针就到了最大的位置
}
判断栈是否已空
int stack_isempty(seqstack_t* s)
{
return (s->top == -1);//当top等于-1时说明栈里面没有元素
}
入栈
//入栈
int stack_push(seqstack_t* s, int data)
{
if (stack_isfull(s))
{
printf("栈已满\n");
return -1;
}
s->top++;//栈顶指针加一
s->data[s->top] = data;
return 0;
}
出栈
//出栈
int stack_pop(seqstack_t* s)
{
int value;
if (stack_isempty(s))
{
printf("栈已空");
return -1;
}
value = s->data[s->top];
s->top--;
return value;
}
测试
int main()
{
seqstack_t* S = seqstack_init();
printf("入栈");
for (int i = 1; i < 5; i++)
{
printf("%d", i);
stack_push(S,i);
}
printf("\n");
printf("出栈");
while (!stack_isempty(S))
{
int value = stack_pop(S);
printf("%d", value);
}
return 0;
}