3.3.1括号匹配问题
IDE可视化的编程环境
作为一名程序开发人员,不管你使用哪门语言开发都有很多可以选择的集成开发环境IDE(Integrated Development Environment),IDE是提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。开发者可以通过IDE提供的代码高亮,代码补全和提示.
算法演示:
此时栈空
算法流程图:
算法实现
字符型的数组里面存储了小括号,中括号和大括号(char str[])
用topElem存储弹出的栈顶元素。
用一个静态数组存储栈中的元素。
3.3.2栈在表达式求值的应用(上)
比较喜欢考察中缀表达式
中缀,后缀,前缀表达式
注意操作数的前后顺序在后缀表达式不能改变
或者(看成一个整体)
接下来哦我们再来看前缀表达式:
混合运算转换:
中缀
后缀
前缀
运算符和操作数 中缀表达式和后缀表达式的生效顺序是相同的。
再来连一个例子:
但是由于运算顺序不唯一,因此后缀表达式也不唯一。
客观来看两种都是正确的,但是前者是“计算”结果。
要采取“左优先”原则,
左边的减号先于右边的除号先实现。
那么如何进行手算:
后缀表达式的计算(计算)
若表达式合法,则最后栈中只会留下一个元素,就是最终结果。
中缀表达式转前缀表达式(手酸)EASY
如果是右优先
3.3.3 站在表达式求值中的应用(下)
算法的整体方法:
减号和加号优先级相同。弹出加号,减号入栈(根据后缀表达式反波兰左优先原则)
把乘号也压入栈中,不确定是否后面又括号。
看成整体,把左边减号弹出。
再来一个例子,再有括号的情况下:
完成了栈的后缀表达式的计算。
后缀转中缀(用栈实现)————栈用来存放操作数
(1)
(2)有运算符栈也有操作数栈
先弹出来的的是右操作数
压辉栈顶
、
3.3.4栈在递归中的应用
函数调用背后的过程
函数调用的特点:最后被调用的函数最先执行结束(LIFO)
func1改变的参数的值a,b并没有改变主函数中a,b的值。
存放函数,实参,函数变量。
适合用“递归”算法解决:可以把原始问题转换为属性相同,但规模较小的问题:
递归调用时,函数调用栈可称之为“递归工作栈”
每进入一层递归,就将递归调用所需信息压入栈顶,每退出一层信息,就从栈顶弹出响应信息。
缺点:太多递归可能会导致栈溢出。
也就是空间复杂度太高。
3.3.5队列的应用
分层遍历
一边进,一边出
123-->23-->2345-->345-->34567-->4567-->567-->56789-->6789-->789-->7891011
把左右孩子放在队尾
队列应用———图的广度优先遍历
123-->23--> 234-->34-->3456-->456-->56-->5678(实现了图的广度优先遍历)
队列在操作系统中的应用
对各进程争抢使用有限的系统资源,FCFS(FIRST COME FIRST SERVICE)
多个电脑使用一个打印机
可缓解主机与打印机速度不匹配的问题(使用队列把数据组织起来)