队列
目录
常见应用
- 脱机打印输出:按申请的先后顺序依次输出
- 多用户系统中多用户排队分时循环使用CPU和主存
- 按用户的优先级排成多个队,每个优先级一个队列
- 实时控制系统中,信号按接收的先后顺序一次处理
- 网络电文传输,按到达的先后顺序依次进行
顺序队
表示
-
最大队列长度
-
const MAXQSIEZE=100;
-
或#define MAXQSIZE 100
-
重定义结构体
- QElemType *base(顺序队数组的首元素地址)
- int front;头指针,如果队列不空,指向队头元素front队头元素下标
- int rear;尾指针,如果队列不空,指向队尾元素再往后一个位置,和栈顶指针一个意思。rear队尾元素下标
- 注意头尾指针不是真正的指针,是表示下标的int型变量罢了。
-
重定义结构体的新类型名字就叫SqQueue,我们一般SqQueue Q;这样就定义了一个顺序队列。你也可以给队列起别的名字不只是Q,下面采用队列的默认名字Q来说事。
上溢:队列满了,你还往队尾添加元素。那我让rear指针怎么在往上走呢?所以就要报错说上溢了
下溢:队列空了,你还要从队头删除元素,那我让front指针怎么再往下走呢?所以就要报错说下溢了
出队从队头(front指针指的元素)出队,入队从队尾入队(rear指针指的空间入队)
- 所以会造成假上溢的问题,就是你出队front指针往上走一格,然后入队rear指针也往上走,会不会rear指针都走到头了(数组最后一个元素再往后一格的地址位置),假如你front指针指向了不是下标为0的位置,此时你队列看着还能添加元素,可是你只能从队尾添加,rear指针都到头了,你还添加个屁。所以,这不就是假上溢了吗?
所以就有了循环队列,就是我可以这样解决假上溢问题
- Q.rear=(Q.rear+1)%MAXQSIZE;这个解决方案很巧妙,假如Q.rear指向了顺序队数组最后一个元素的下标的位置,然后它再+1,是不是就到了上溢的临界点(还没上溢,可能就是队列假满了)?然后比如MAXQSIZE是6,啊,那最后一个元素下标是5,然后5+1再对6取余,这样是不是Q.rear回到了0?这样不就可以在顺序队数组前头添加元素了?解决了假上溢问题
- front指针也是如此,front指针在顺序队列也会有一次指向了数组最后一个元素下标的位置。然后+1就要到了上溢临界点,然后采取跟Q.rear一样的操作——Q.front=(Q.front+1)%MAXQSIZE;然后就解决了假上溢问题
- 当然你也可以一个if判断rear/front指针是否指向了队列数组最后一个元素的下一个位置,然后让