从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此可以
称为限定性的数据结构。
1.栈
栈是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊的含义,称为栈顶(top),相应的,表头端称为栈底。不含元素的空表
称为空栈。
栈又称为后进先出的线性表(last in first out,LIFO)。
栈的表示和实现:
1.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
1.表达式求值:
表达式求值是程序设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子。
算符优先法就是根据这个运算优先关系的规定来实现对表达式的编译或解释执行的。任何一个表达式都是由操作数,运算符和界限符组成的,我们称它们
为单词。一般的,操作数既可以是常数也可以是被说明为变量或常量的标识符;运算符可以分为算术运算符,关系运算符和逻辑运算符3类;基本限界符有
左右括号和表达式结束符等。
我们把运算符和界限符统称为算符,它们构成的集合命名为OP。
2.栈与递归的实现
栈还有一个重要的应用就是程序设计语言中实现递归。一个一直调用自己或通过一系列的调用语句间接的调用自己的函数,称作递归函数.
通常,当在一个函数的运行期间调用另外一个函数时,在运行被调用函数之前,系统需要完成3件事:(1)将所有的实在参数,返回地址等信息传递给被调用
函数保存;(2)为被调用函数的局部变量分配存储区;(3)将控制转移到被调用函数的入口。而从被调用函数返回调用函数之前,系统也应完成3件事:(1)保存
被调函数的计算结果;(2)释放被调函数的数据区;(3)依照被调函数保存的返回地址将控制转移到调用函数。当有多个函数构成嵌套调用时,按照'后调用先
返回'的原则,上述函数之间的信息传递和控制转移必须通过'栈'来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,
就为它在栈顶分配一个存储区,每当从一个函数退出时,就释放它的存储区,则当前正在运行的函数的数据区必在栈顶。
一个递归函数的运行过程类似于多个函数的调用,只是调用函数和被调用函数是同一个函数。因此,和每次调用相关的一个重要概念是递归函数的运行的'层次'。
假设调用该递归函数的主函数为第0层,则从主函数调用递归函数为进入第1层;从第i层递归调用本函数进入'下一层',即第i+1层。反之,退出第i层应返回至
'上一层',即第i-1层。
2.队列
和栈相反,队列是一种先进先出(FIFO)的线性表。它只允许在表的一端进行插入,而在另外一端删除元素。在队列中,允许插入的一端叫做队尾(rear),允许删除的
一端叫做队头(front)。
双端队列:是限定插入和删除在表的两端进行的线性表。
用链表表示的队列简称为链队列。