2.1 栈ADT
栈是只在表的末端进行插入和删除操作的表,表的末端也叫做栈的顶端。
栈的基本操作有Push(进栈)和Pop(出栈)。前者相当于插入,后者则是删除最后的元素。
图2-1 栈模型
栈模型又叫LIFO(后进先出)表,由于栈是一个表,因此任何实现表的方法都能实现栈。常见的两种方法一个是使用单链表,另一个则是用线性表的顺序存储结构(即数组)实现。
2.2 栈的应用
后缀表达式
对于算数表达式 1+2+3*4=,这样的表达方式叫做中缀表达式,由于计算机的不同,这个结果或许是24,也可能是科学答案15,最简单的四功能计算器将给出第一个答案,而许多先进的计算器是知道乘法的优先级是高于加法的。
而对于1*2+3+4*5=,这样的表达式,我们通常需要加括号来得到的正确的答案,如果是使用简单计算器计算,我们则需要记住中间结果。
运用栈的思想来看待这个表达式,典型的计算顺序是将1和2相乘存为A1,然后A1和3相加得到的新结果存入A1。再将4和5相乘存为A2,最后A1和A2相加存入A1,这样的操作顺序可以按一些形式书写:
1 2 * 3 + 4 5 * +
这种记法叫做后缀记法或逆波兰(reverse Polish)记法。当我们见到一个数时就把他推入栈中;遇到一个运算符时就作用于栈顶端的两个数上,再将所得的一个结果重新推入栈中,如图(2-2)
图2-2 用栈的思想解释后缀表达式
运用这种算法的有点在于,当一个表达式以后缀记号给出时,没有必要知道任何优先规则。栈的引入,可以让我们的程序设计变得模型化,有了一个具体的模型概念在让我们面对复杂的程序设计问题时会轻松很多。
3.1 队列ADT
队列也是一种表,和栈不同的是,在对队列进行操作时,我们在一段进行删除,在另一端进行插入。
队列有Enqueue(入队)和Dequeue(出队)两个基本操作,前者是在表的末端(队尾)插入一个元素,后者是删除或返回在表的开头(队头)的元素。
图3-1 队列模型
和栈一样,对于队列的每一种操作,常见都能用数组和链表实现。
3-2 队列的运用
实际生活中,每次排队都应该是一个队列。如排队在食堂打饭,大家都是按先来后到的顺序来打翻,队头的人打完饭就走了,(出队),刚来的同学则只能在队尾排队(入队)。
在计算机网络中,也经常用到队列,许多时候,不同用户对同一文件的访问也需要遵从先来后到的原则,而一些大型的应用中,如很多人同时进入同一系统,由于资源有限,用户不得不排队进行访问,在终端呆的时间最长的用户将被首先强制离开,而等待时间最长的用户则是下一个被允许访问的用户。
除此之外,队列还有其他丰富的用途,许多诸如此类的问题都将用到被称为排队论的数学分支,这些问题在商业上起到了很大的影响。
本文部分思路来自《数据结构与算法分析——C语言描述》,文中引用的图片均来自百度搜索,如有侵权请及时联系我