栈:元素存取的操作是一种FILO(先进后出/后进先出)的操作,每次进/取栈只能操作一个元素
应用:恢复/撤销
栈:一口井
栈顶:能被操作(进、出)的一端
栈底:不能被操作的一端
顺序栈:容器是一个数组
栈的操作:
1、栈满 条件: top== N-1
IsFull
2、栈空 条件:top==-1 (数组从下标为0开始可以存值)
IsEmpty
3、出栈
pop
4、进栈
push
5、取次栈顶
Stacktop()
6、栈长度 :
StackLength
7、初始化栈
InitStack
8、遍历栈:
StackList
#include<stdio.h>
struct Stack
{
int buf[10];
int top;
};
void InitStack(struct Stack* pcs)//初始化,指向-1。
{
pcs->top=-1;
}
int IsFull(struct Stack* pcs)
{
if(pcs->top+1==10)
return 1;
else
return 0;
}
int IsEmpty(struct Stack* pcs)
{
if(pcs->top==-1)
return 1;
else
return 0;
}
int pop(struct Stack* pcs,int* k)//出栈
{
if(IsEmpty(pcs)==0)
{
*k=pcs->buf[pcs->top];
pcs->top=pcs->top-1;
return 1;
}
else
return 0;
}
int push(struct Stack* pcs,int k)//进栈
{
if(IsFull(pcs)==0)
{
pcs->top=pcs->top+1;//这里跟队不一样,要先加在赋值。
pcs->buf[pcs->top]=k;
return 1;
}
else
return 0;
}
int main()
{
struct Stack cs;
InitStack(&cs);
push(&cs,1);
push(&cs,2);
push(&cs,3);
push(&cs,4);
push(&cs,5);
push(&cs,6);
push(&cs,7);
push(&cs,8);
push(&cs,9);
push(&cs,10);
push(&cs,11);//测试能不能判断栈满,实际没存进去。
int k;
while(pop(&cs,&k)==1)
{
printf("当前出栈的是%d,栈内剩余%d个元素\n",k,cs.top+1);
sleep(3);
}
return 0;
}