数据结构(二) 栈和队列
二、栈和队列
1、栈的表示与实现
2、栈的应用
3、队列的表示和实现
链队列
循环队列
栈和队列
栈和队列都是特殊的线性表,它们的基本操作是线性表操作的子集,是操作受限的线性表。
栈
特点:只在表头进行插入与删除操作。表头端成为栈顶,表尾称栈底。
LIFO:后进先出。
栈的实现
栈的实现有两种方法:顺序栈和链栈。
顺序栈利用一组地址连续最大长度为MAX_STACK_SIZE的存储单元依次存放从栈底到栈顶的数据元素。
在程序中同时使用多个栈的情形下,使用链式栈不但可以提高存储效率,同时还可达到共享存储的目的。链式栈一般不使用头节点。
队列(queue)
FIFO:先进先出,只允许在一端插入,在另一端删除。
队列的两种存储结构:顺序存储、链式存储。
1、 链队列
链队列应有2个分别指示队头队尾的指针,即头指针与尾指针。
如果从队列中退出一个元素,必须从单链表的第一个节点中取出队头元素,并删除此节点,而入队的新元素是存放在队尾处的,也就是单链表的最后一个元素的后面,并且此结点会成为新的队尾。
Ps:队列适合于数据元素变动比较大的情形,一般不存在溢出的问题,如果程序中要使用多个队列,最好使用链队列,这样将不会出现存储分配问题,也不必进行数据元素的移动。
2、 循环队列
队列的顺序存储结构,实际是利用一个容量是maxSize的一维数组elem作为队列的元素的存储结构,并设立的两个front和rear分别表示队头和队尾。
当队列的实际可用空间还没有使用完却不能再插入新元素,这种情形继续插入会产生溢出叫做“假溢出”。
为了解决假溢出,我们把顺序队列从逻辑上看成一个环,成为循环队列,循环队列首尾相接。
循环队列中,从front=rear无法判断是队空还是队满,有3中处理办法:
A、 另设一个标志符区别队列是空还是队满。
B、 用一个数据成员存储元素的个数。
C、 少用一个元素空间,约定在队尾指针的下一位置作为队满的标志。