在队列的顺序存储中,采用出队方式 2, 删除 front 所指的元素,然后加 1 并返回被删元素。这样可以避免元素
移动,但是也带来了一个新的问题"假溢出"。
可采用循环队列

cpp
// 循环队列
typedef struct Queue{
DataType queue[MaxSize]; //存储数据的数组
int front; //循环队头指针
int rear; //循环队尾指针
}CircularQueue;
CircularQueue CQ;
循环队列入队
队尾循环后移: CQ->rear =(CQ->rear+1)%MaxSize;
循环队列出队
队首循环后移: CQ->front =(CQ->front+1)%MaxSize;
队空:
CQ.front=CQ.rear; // CQ.rear 和 CQ.front 指向同一个位置
队满:
(CQ.rear+1) %MaxSize=CQ.front; // CQ.rear 向后移一位正好是 CQ.front
计算元素个数:
可以分两种情况判断:
- 如果 CQ.rear>= SQ.front:元素个数为 CQ.rear-CQ.front;
- 如果 CQ.rear<SQ.front:元素个数为 CQ.rear-CQ.front+ MaxSize;
采用取模的方法把两种情况统一为:(CQ.rear-CQ.front+MaxSize)% MaxSize
cpp
#include <iostream>
#include <iomanip>
#define MaxSize 5 //循环队列的最大容量
using namespace std; //循环队列中元素类型
typedef int DataType;
// 循环队列
typedef struct Queue{
DataType queue[MaxSize]; //存储数据的数组
int front; //循环队头指针
int rear; //循环队尾指针
}CircularQueue;
//队列初始化,将循环队列初始化为空队列
void InitQueue(CircularQueue* CQ) {
if (!CQ) { return; }
//把对头和队尾指针同时置 0
CQ->front = CQ->rear = 0;
}
//判断队列为空
bool IsEmpty(CircularQueue* CQ) {
if (!CQ) { return false; }
if (CQ->front == CQ->rear)
{
return true;
}
return false;
}
//判断循环队列是否为满
bool IsFull(CircularQueue* CQ) {
if (!CQ) { return false; }
if ((CQ->rear + 1) % MaxSize == CQ->front) {
return true;
}
return false;
}
//入队,将元素 data 插入到循环队列 SQ 中
bool EnterQueue(CircularQueue* CQ, DataType data) {
if (!CQ ){ return 0; }
if(IsFull(CQ)) {
cout <<"无法存入: "<<data<< " 队列已满!!! " << endl;
return 0;
}
CQ->queue[CQ->rear] = data;
CQ->rear = (CQ->rear + 1) % MaxSize;; //队尾指针循环后移一位
return 1;
}
//出队,将队列中队头的元素 data 出队,出队后队头指针 front 后移一位
DataType DeleteQueue(CircularQueue* CQ, DataType* data){
if (!CQ || IsEmpty(CQ))
{
cout << "循环队列为空!" << endl;
return 0;
}
*data = CQ->queue[CQ->front];
CQ->front = (CQ->front + 1) % MaxSize;
return *data;
}
//获取队列中元素的个数
int getLength(CircularQueue* CQ) {
if (!CQ) { return 0; }
return(CQ->rear - CQ->front + MaxSize) % MaxSize;
}
//打印队列中的各元素
void PrintQueue(CircularQueue* CQ) {
if (!CQ) { return; }
string str(50, '-');
cout << str << endl;
cout << "循环队列:";
int i = CQ->front;
while (i != CQ->rear) {
cout << setw(2) << CQ->queue[i] << " ";
i = (i + 1) % MaxSize;
}
cout << endl << endl;
}
int main() {
CircularQueue *CQ = new CircularQueue;
DataType data = -1;
InitQueue(CQ);
for (int i = 1; i < 7; i++) {
EnterQueue(CQ, i);
}
PrintQueue(CQ);
cout << "出队列元素: " << DeleteQueue(CQ, &data) << endl;
cout << "出队列元素: " << DeleteQueue(CQ, &data) << endl;
EnterQueue(CQ, 88);
EnterQueue(CQ, 66);
PrintQueue(CQ);
cout << "队列元素个数: " << getLength(CQ) << endl;
system("pause");
return 0;
}