栈和队列的思想应用

来源:互联网 发布:php 代理教程 编辑:程序博客网 时间:2024/05/20 18:52

栈和队列的应用

  在日常生活中,很多问题可以归结到栈和队列的应用问题。例如,排队购物的现象就可以看做是队列。在计算机学科的应用中,栈和队列的应用就更多了,例如,编译系统、消息队列等。

 栈的应用

  栈具有相当广泛的实际应用,例如,可以颠倒数据串的次序、为回溯算法提供支持、实现自动机等。
  1.编译应用
  栈可以应用于括号匹配、行编辑器、表达式求值、算法优先文法等编译程序中。例如,在表达式中,一般存在大、中、小三种括号,分别定义为“{}”、“[]”和“()”,要求其只能自我匹配,不能交互匹配,比如“{[()]}”、“[()()()]”等均为正确匹配,而“({]”、“(])[”、“)(]}”等均为错误匹配。使用栈检测括号是否匹配的算法描述如下:

  2.转置应用
  一串数据全部进入栈后再全部出栈,将得到一个次序完全相反的数据串,这是栈的特性之一。因此,栈可以应用于转置操作,例如,数的进制转换等。
  例子:已知线性链表L,请按从表尾到表头的顺序输出元素。
  【解析】从头到尾遍历链表,同时将链表元素入栈,再依次出栈,并打印元素信息即可。其算法描述如下:

  3.迷宫问题
  迷宫问题是指在迷宫中从入口寻找出口的问题。此类问题的本质是将迷宫建模成图,将迷宫中的点建模为图中的点,将迷宫中相连并且相通的两点建模为图中的一条边,一般采用矩阵方式存储图,这样迷宫求解就转化为图的遍历,采用回溯法穷举所有从入口点到出口点之间的路径即可。
  迷宫问题求解算法中一般使用一个栈来存储访问过的顶点信息,栈中元素(即顶点信息)由顶点位置和搜索方向两部分组成,前者记载该顶点在迷宫中的位置,后者记载下一个顶点的访问方向,例如,右、下、左、上四个相连的方向,编程时可分别使用枚举类型enum表示。

 队列的应用

  队列是一种相当实用的数据结构,可应用于生产、生活的各个方面,例如,共享打印机、消息队列和广度优先搜索等。
  1.共享打印机
  目前,打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。这样,利用队列的先进先出特性,就可完成打印机网络共享的先来先服务功能。
  2.消息队列
  操作系统中的消息队列也是队列的应用之一,消息队列遵循先进先出的原则,如图2-5所示,发送进程将消息写入队列尾,接收进程则从队列头读取消息。