> 文章列表 > 3.3栈和队列的应用

3.3栈和队列的应用

3.3栈和队列的应用

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)

 

 

多个电脑使用一个打印机

 

 可缓解主机与打印机速度不匹配的问题(使用队列把数据组织起来)