3.1栈的类型定义(存在栈顶,栈底)
相对于线性表特点为:插入和删除只能在特定的地方进行。
3.2栈的应用举例
1,数制转换,
2.括号匹配的检验,
检验括号是否匹配的方法用"期待的急迫程度"这个概念来描述。
分析可能出现的不匹配的情况:
1),到来的右括弧非是所"期待"的(和栈顶元素不相等);
2),到来的是"不速之客"(栈以经空,表达式没还有右括弧);
3),直到结束,也没有到来所"期待"的(栈不空,表达式结束);
算法的设计思想:
1),凡出现左括弧,则进栈;
2),凡出现右括弧,首先检查栈是否空,若栈空,则表明"右括弧"多了否则和栈顶元素比较,若相等,则"左括弧出栈"否则不匹配
3),表达式检验结束时,若栈空,则匹配正确,否则表明"左括弧"多了。
3,行编辑程序问题,
设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。
4,迷宫求解,
基本思想:
1),若当前位置"可通",则纳入路径,继续前进
2),若当前位置"不可通",则后退,换向探索
3),若四周均"不可通",则从路径中删除
5,表达式求值,
表达式分为:前缀式,中缀式,后缀式
特点:1,操作数之间的相对次序不变;
2,运算符的相对次序不同;
3,中缀式丢失了括弧信息,致使运算的次序不确定;
4,前缀式的运算规则为:连续出现的两个操作数和在它们之前紧靠它们的运算符构成一个最小表达式;
5,后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。
后缀式求值方法:先找运算符(保存在栈中),再找操作数。
从原表达式求得后缀式的规律为:
1),设立操作数栈;
2),设表达式的结束符为"#",并设运算符栈的栈底为"#";
3),若当前字符是操作数,则直接发送给后缀式;
4),若当前运算符的优先数高于栈顶运算符,则进栈;
5),否则,退出栈顶运算符发送给后缀式;
6),"("对它之前后的运算符起隔离作用,")"可视为自相应左括弧开始的表达式结束;
6,实现递归。
当一个函数的运行期间调用另一个函数时,在运行该被调用函数之前,需先完成三件事:
1),将所有的实参,返回地址等信息传递给被调用函数保存;
2),为被调用函数的局部变量分配存储区;
3),将控制转移到被调用函数的入口。
从被调用函数返回调用函数之前,应该完成:
1),保存被调函数的计算结果;
2),释放被调用函数的数据区;
3),依照被调用函数保存的返回地址将控制转移到调用函数。
多个函数嵌套调用的规则是:后调用先返回此时的内存管理实行"栈式管理"
3.3栈类型的实现(顺序栈,链栈)
3.4队列的类型定义
存在队头,队尾
3.5队列类型的实现(链队列--链式映象,循环队列--顺序映象)
例题算法
判别读入的字符序列是否为"回文"的算法的基本思想是:将依次读入的字符分别插入栈和队列,然后依次比较"栈顶"和"队头"的字符。