1100 字
6 分钟
Stack Queue

栈和队列的应用#

栈在括号匹配的应用#

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序任意,只需要成对匹配即位正确,否则为不正确。

算法思想如下:

  1. 初始设置一个空栈,顺序读入括号。
  2. 若是右括号,则和栈顶最紧迫的期待的括号消解,如果不能成对消除则不合法,退出程序。
  3. 若是左括号,则作为一个新的更紧迫的期待压入栈中。当算法结束时,栈为空,否则不合法。

栈在表达式求值的应用#

表达式求值可以结合二叉树进行理解。其中中缀表达式不仅依赖算符的优先级,而且还要处理括号。后缀表达式的运算符在操作数后面,在后缀表达式中已经考虑了运算符的优先级,所以没有括号只有操作数和运算符。通过后缀表达式表示计算过程为:

  1. 顺序扫描表达式的每一项。
  2. 如果是操作数则压入栈中
  3. 若是操作符,则从栈中出栈两个操作数进行运算并将结果重新入栈。
  4. 扫描完毕后,栈顶元素就是最后的运算结果。

栈在递归中的应用#

递归即把一个大型的复杂问题层层转化成一个与原问题相似的规模较小的问题来就求解的过程,往往只需要少量代码就可以描述出解题过程中的多次重复计算,虽然减少了程序代码量,但是效率并不会很高。

在递归调用的过程中,系统为每一层的返回点、局部变量、传入实参等开辟了递归工作栈来进行数据存储,递归的次数过多容易产生栈溢出,效率不高的原因是因为递归调用过程会产生重复运算,但是代码简单,容易理解,可以为初学者提供解题思路。

队列在层次遍历中的应用#

在信息处理中有一大类问题需要逐层或逐行进行处理,这种问题往往是在处理当前层或行时就对下一层或下一行进行预处理,把处理顺序安排好,等当前层或当前行处理完毕就可以进行处理下一层或者下一行,这个过程就可以使用队列保存下一步的处理顺序,类似于二叉树的层序遍历。

队列在计算机系统中的应用#

队列在计算机系统中的应用非常广泛,一方面是解决主机与外部设备之间速度不匹配的问题,一方面是解决由多用户引起的资源竞争问题。

第一方面仅以主机和打印机之间速度不匹配的问题作说明。主机把数据输送给打印机,输出的数据速度比打印机的速度快得多,解决的方法就是设置一个打印数据缓冲区,主机把要打印的数据写入这个缓冲区,写满后就暂停输出,转去做其他事情,打印机就从缓冲区按照先进先出的原则依次取出数据并打印,打印完再向主机发出申请,主机接到请求后再向缓冲区写入打印数据。这样做既保证了打印的数量正确,又使主机提升了效率。

第二个方面,CPU 资源的竞争就是一个典型的例子。在一个带有多终端的计算机系统上,由多个用户需要 CPU 各自运行自己的程序,他们分别通过各自的终端向操作系统提出占用 CPU 的请求。操作系统通常会按照请求在时间上的先后顺序把他们呢拍成一个队列,每次把 CPU 分配给队首请求的用户使用。当对应的程序运行结束或用完规定的时间间隔,令其出队,再把自己 CPU 分配给新的队首请求的用户使用。这样既保证了每个用户的请求,又能使 CPU 正常运行。

Stack Queue
https://songbaicheng.cc.cd/posts/stack-queue/
作者
宋柏成
发布于
2026-06-05
许可协议
CC BY-NC-SA 4.0