栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因 此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。由于它们广泛应用在各种软件系统中,因此在面向对象 的程序设计中,它们是多型数据类型。本章除了讨论栈和队列的定义、表示方法和实现外,还将给出一些应用的例子。
抽象数据类型栈的定义
栈(Stack) 是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的空表称为空栈。
(1)queue和stack类都是容器适配器(container adaptor),容器适配器将一些基础容器转化为自身类的容器。容器适配器构造时需要一个容器模板,例如vector,deque,list等, queue和stack默认的容器模板是deque。这些容器模板也是有一定要求的,需要支持一些基础的方法,比如说vector类就不能做queue的 容器模板(或者叫基础容器),因为vector没有pop_front方法。
(2)队列,queue,满足:1)插入只能从尾部进行;2)删除,检索,修改只允许从头部进行,于是就有先入先出(FIFO)的规律。queue的方法很少,也没有迭代器,而且其唯一可以被访问,修改的量就是queue开头的项。
(3)堆栈,stack,与queue正好相反,后入先出(LIFO)。stack同样没有迭代器,只有堆栈顶部的项才可以被访问。-->可以利用堆栈来实现递归,事实上,编译器实现递归就是通过创建和维护活动对战的代码来实现的 。