栈和队列都是特殊的线性表,但是是操作受限制的线性表
一、栈(LIFO结构)
1、顺序栈:
用数组进行存储。利用数组是否为空进行栈为空的判断。有的时候有多个栈同时存在的情况,如果没有给足够大的空间的话就会导致栈溢出。一般解决方法是定义一个足够大的栈空间,此存储空间的连段分别设为两个栈的栈底,两个栈的栈顶都想中间伸展,直到两栈顶相遇才溢出。
一般有多个栈,最好还是使用链式存储结构
2、链式栈
当程序中有多个栈时,使用链式栈,不仅可以防止溢出,还可以共享空间,提高存储效率。一般不使用头节点,直接实现
二、队列(FIFO)
队列一般只允许一端进行入队和出队。还有一种限定性数据结构:双端队列。一端可以进行两种操作,一端一种
1、链式队列
表示一个队列,需要一个队头指针和队尾指针。链式队列适合数据变动比较大的情形,一般不存在溢出。当程序有多个队列时,尽量使用链式队列,这样不会出现存储分配问题,也不用进行数据元素移动
2、顺序存储
用一个一维数组,并且维护两个变量——front和rear,存储队头和队尾。用一维,如果不经过处理,会出现假溢出现象(比如A数组有5个空间,A3为队头,A5为队尾,这样这个队再在队尾插入数据就会溢出,但是A明明还有空间)。应该使用循环队列,使首尾相接,使用%实现。判断队列是否满时,不能通过front==rear判断,因为这种情况队为空的时候也满足。有两种方法进行处理:1、另外设立一个专门的标识符区别队列是否满 2、少用一个元素空间,规定队头在队尾的下一个位置时为满