Stack
只允许在一端进行插入或删除操作的线性表
后进先出LIFO
进栈顺序:a1->a2->a3->a4->a5
出栈顺序:a5->a4->a3->a2->a1
基本操作
InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。创建
DestroyStack(&L):销毁栈。销毁并释放栈S所占用的内存空间。销毁
Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶。增
Pop(&S,&x):出栈,若栈S非空,则弹出栈项元素,并用x返回。删
GetTop(S, &x):读栈顶元素。若栈S非空,则用x返回栈顶元素。查
查栈的使用场景中大
多只访问栈顶元素
其他常用操作
StackEmpty(S):判断-一个栈S是否为空。若S为空,则返回true,否则返回false。
规律
n个不同元素进栈,出栈元素不同排列的个数为
$$ \frac{1}{n+1}\sideset{}{^n_2n}C $$
1/n+1乘Cn 2n
上述公式称为卡特兰(Catalan) 数,可采用数学归纳法证
明(不要求掌握)
5个进栈有42种方式
顺序栈
定义
1 |
|
顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)
。
初始化
1 | //初始化栈 |
判断是否为空
1 | //判断栈空 |
进栈
1 |
|
出栈
1 | //出栈操作 |
读栈顶元素
1 | //读栈项元素 |
销毁
清空:top=-1
回收:系统自动回收
栈顶指针的另一种设计方式
在初始化栈的时候 S.top=-1
改为S.top=0
即设定top指向下一个元素
出栈和入栈等操作相应的改变
S.data[++S.top]=x
->S.data[S.top++]=x
x=S.data[S.top--]
->x=S.data[--S.top]
缺点
栈的大小不可变
共享栈
两个栈共享一片空间
1 | //定义 |
链栈
相当于一个规定只能从头节点一侧进行操作的单链表
定义
1 | typedef struct Linknode{ |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.