目录
3.1_1 栈的基本概念
一、栈的定义
栈(Stack)是只允许在一端进行插入或删除操作的线性表。
栈的逻辑结构与普通线性表相同,但是在插入、删除上会有区别。
特点:后进先出 Last In First Out(LIFO)
重要术语:
栈顶:允许插入和删除的一段;
栈底:不允许插入和删除的一段;
空栈:没有数据元素的栈;
二、栈的基本操作
InitStack(&S) |
初始化栈 |
构造一个空栈S,分配内存空间; |
DestroyStack(&S) |
销毁栈 |
销毁并释放栈S所占的内存空间; |
Push(&S, x) |
进栈 |
若S未满,则将x加入使之成为新栈顶; |
Pop(&S, &x) |
出栈(删除栈顶元素) |
若栈S非空,则弹出栈顶元素,并用x返回; |
GetTop(S, &x) |
读栈顶元素(不删除栈顶元素) |
若栈S非空,则用x返回栈顶元素; |
StackEmpty(S) |
判断一个栈S是否为空 |
若S为空,则返回true,否则返回false; |
关于查找操作,栈的使用场景中大多只访问栈顶元素,所以用GetTop(S, &x)读取栈顶元素就可以了。
常考题型:
Q:分别有五个数据元素a, b, c, d, e,它们的进栈顺序也是如此,问有哪些合法的出栈顺序?
A:思路:元素不是一口气全都进栈的,所以不只有e, d, c, b, a,这一种出栈顺序;它也可以先a, b,进栈,再b, a,出栈,然后再c, d, e,的进栈、出栈,所以出栈顺序有很多,就不一一列举了;那么合法的出栈顺序一共有多少种呢?
n个不同元素进栈,出栈元素不同排列的个数为{1/(n+1)}C(下2n上n)。上述公式称为卡特兰(Catalan)数,可采用数学归纳法证明(不要求掌握)。
{1/(5+1)}C(下5上10) = (10 * 9 * 8 * 7 * 6)/(6 * 5 * 4 * 3 * 2 * 1) = 42
3.1_2 栈的顺序存储实现
顺序栈的实现有两种方式,区别在于top指针的位置,top指针读起来有“指针”两个字,但是它是int整型变量,存放的是栈顶的位置;
第一种方法:top指针指向栈顶元素,初始化时top = -1,打个比方理解的更容易一点,就是指向了羽毛球筒里的第一个要被拿出来的羽毛球(已存在元素)的位置;
第二种方法:top指向栈顶元素的下一位,初始化时top = 0,再用相同的场景,就是指向羽毛球筒里下一个羽毛球要被放入的位置;
一、顺序栈的定义、初始化、判空
顺序栈的存储方式为顺序存储:给数据元素分配连续的存储空间,大小为:MaxSize * sizeof(ElemType)&#x