1. 栈:是限定仅在表尾进行插入和删除操作的线性表;又称后进先出的线性表。LIFO结构。
栈顶top:允许插入和删除的一端;
栈底bottom:另外一端;
2. 栈的操作:
进栈,压栈,入栈:栈的插入操作;
出栈,弹栈:栈的删除操作;
栈中有一个元素时,top=0;
空栈时,top=-1;
3. 链式栈
栈的链式存储结构是通过由结点构成的单链表实现的,此时表头指针被称为栈顶指针,由栈顶指针指向的表头结点被称为栈顶结点,整个单链表被称为链栈。链栈和顺序栈不同,链栈是采用一个个存储结点来存储数据的。它不像顺序栈在地址上是连续的线性存储结构。所有的存储单元可以占用连续或不连续的存储区域。每个存储单元在存储栈中的元素a1的同时,也存储其逻辑后继a2的存储地址。
4. 栈的链式存储结构
栈的链式存储结构,简称为链栈;
栈顶放在单链表的头部;
链栈是不需要头结点的。
链栈不存在栈满的情况。
5. 栈的抽象数据类型:
插入和删除:push,pop 同线性表。 元素具有相同的类型,相邻元素具有前驱和后继的的关系。
操作:
a.初始化操作,建立空栈S;
b. 若栈存在,就销毁它;
c.将栈清空;
d.判断栈是否空:空返回true,否则返回false;
e. 若栈存在非空,用e返回s的栈顶元素;
f. 若栈S存在,插入新元素e到栈s成为栈顶元素;g.删除栈s栈顶元素,并用e返回 其值;h.返回栈s的元素个数。
6. 顺序栈
栈的顺序存储其实也是线性表的顺序存储的简化,简称顺序栈。
入栈:栈顶指针加1;将新插入元素赋值给栈顶空间;
出栈:将要删除的栈顶元素赋值给e,栈顶指针减1。
7.共享栈
其实是一个数组,从两边存放数据。原理:用数组的0号位置标记stack1的栈低,top1标记stack1的栈顶;用size-1标记stack2的栈顶,用top2标记Stack2的栈顶,top1和top2向中间移动,只要top1和top2不相遇则栈未满。
8. 中缀表达式转后缀表达式
转换过程如下:
(1)从头到尾扫描中缀表达式,若遇到数字则直接写入后缀表达式,
(2)若遇到运算符,则比较栈顶元素和该运算符的优先级,当该运算符的优先级大于栈顶元素的时候,表明该运算符的后一个运算对象还没有进入后缀表达式,应该把该运算符暂存于运算符栈中,然后把它的后一个运算对象写入到后缀表达式中,再令其出栈并写入后缀表达式中;若遇到的运算符优先级小于等于栈顶元素的优先级,表明栈顶运算符的两个运算对象已经被写入后缀表达式,应将栈顶元素出栈并写入后缀表达式,对于新的栈顶元素仍进行比较和处理,直到栈顶元素为#,然后将新元素进栈。
9. 递归
把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,叫做递归函数。每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。
10. 后缀表达式计算结果
从左到右遍历表达式的每个数字和符号,遇到数字进栈,遇到符号就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,直至最终获得结果。