《数据结构》一文带你了解栈和队列的应用

70 阅读3分钟

1.栈在括号匹配中的应用

算法思想

  • 1)初始设置一个空栈,顺序读入括号 2)若是右括号,则或者使置于栈顶的最急迫期待得以消解,或者使不合法的情况。 3)若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性降了一级。算法结束时,栈为空,否则括号序列不匹配。

栈在表达式求值中的应用

中缀表达式转后缀表达式

  • 优先级表格

    • 操作符 | # | ( | *,/ | +,- | ) -------- | ----- | ----- | ----- | ----- | ----- |
      isp | 0 | 1 | 5 | 3 | 6 icp | 0 | 6 | 4 | 2 | 1
  • 算法思想

    • 需要根据操作符的优先级来进行栈的变化,isp表示栈内优先,icp表示栈外优先。 1.每次扫描时若遇到符号,则用栈顶符号的isp与该符号的icp作比较。 1)若isp<icp,进栈。 2)若isp==icp,退栈。 3)若isp>icp,退栈并输出。 2.若遇到操作数直接输出。

通过后缀表达式计算值

  • 算法思想

    • 顺序扫描表达式的每一项,然后根据它的类型做如下相应操作:若该项是操作符,则连续从栈中退出两个操作数Y和X,形成运算指令XY,并将计算结果重新压入栈中。所有项扫描完后,栈顶存放的就是最后计算结果。

2.栈在递归中的应用

递归定义

  • 递归是一种重要的程序设计方法。简单来说,若一个函数、过程或数据结构的定义中又应用了它自身,则这个函数、过程或数据结构成为是递归定义的。

例子

 [Fib(n-1)+Fib(n-2),n>1
 Fib(n) =< 1, n=1
 0, n=0

代码

int Fib(int n){ //斐波那契数列的实现
  if(n==0)
     return 0; //边界条件
  else if(n==l)
      return 1; //边界条件
  else
    return Fib(n-1)+Fib(n-2); //递归表达式
}

条件

  • 递归表达式(递归体)。 边界条件(递归出口)。

精髓

  • 将原始问题转换为属性相同但规模较小的问题。

3.队列在层次遍历中的应用

二叉树层次遍历算法

  • 该过程的简单描述如下: ①根结点入队。 ②若队空(所有结点都已处理完毕),则结束遍历; 否则重复③操作. ③队列中第一个结点出队,并访问之。若其有左孩子, 则将左孩子入队;若其有右孩子,则将右孩子入队,返回②。

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

主机与外部设备之间速度不匹配

  • 主机输出数据给打印机打印,输出数据的速度比打印数据的速度要快得多,由于速度不匹配,若直接把输出的数据送给打印机打印显然是不行的。解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依次写入这个缓冲区,写满后就暂停输出,转去做其他的事情。打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求。印数据缓 冲区中所存储的数据就是一个队列。

多用户引起的资源竞争

  • CPU资源的竞争就是一个典型的例子。在一个带有多终端的计算机系统上,有多个用户需要CPU各自运行自己的程序,它们分别通过各自的终端向操作系统提出占用CPU 的请求。操作系统通常按照每个请求在时间上的先后顺序,把它们排成一个队列,每次把CPU分配给队首请求的用户使用。当相应的程序运行结束或用完规定的时间间隔后,令其出队,再把CPU分配给新的队首请求的用户使用。