队列
基础概念:限定只能在一端插入、另一端删除的线性表。
一些定义:
允许删除的一端叫做队首(front)
允许插入的一端叫做队尾(rear)
插入称作入队,删除称为出队
队列是先进先出(FIFO)
储存方式:
方式一、顺序存储(数组+双指针)
讨论1:1.为什么使用双指针而非直接将data[0]设置为队头,仅使用一个队尾指针rear?
答:如果仅使用一个队尾指针,的确可以简化入队运算,不需移动元素,只需将元素插入队尾即可。但出队操作时,每次都要删除data[0]的元素,即移动后续元素,同时还需修改rear指针。
讨论2:关于front和rear指针,有多种处理方法,一种是front指向头元素的前一个元素,而非指在头元素上。rear指向队尾。而另一种处理方法则是front指向头元素,rear指向队尾后一个元素,为什么要这样处理?
答:对于普通顺序队列用处不大,但对于循环队列而言可以省去很多麻烦,后续采用第一种处理方式。
普通顺序队列存在的问题:
可能会由于不断的入队和出队导致“假溢出”,即rear指针已经到达队尾而front由于不断出队导致不断后移,致使数组元素其实未满但由于rear到达MAXLEN-1后提示队满。
循环队列
即data[0]紧挨着data[MAXLEN-1]首尾相接成环
即当rear == MAXLEN - 1之后,rear再次++后让rear = 0,这样即形成了一个逻辑上的闭环(而非物理上的)。data数组中由于这样的操作,可能会出现front > rear的情况。
而如何进行这样的运算呢?
方法一、手工判断
rear = (rear + 1 == MAXLEN) ? 0 : rear++;
方法二、取模
rear = (rear + 1) % MAXLEN
出队也是同样的
即
front = (front + 1) % MAXLEN
但是紧接着的问题是如何判断队满或者队空?
不能仅以front == rear 判断,因为这样无法具体判断是队空还是队满。
解决该问题有如下两种方案:
方案一、