任务描述
本关任务:假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
测试说明
输入相应的数字代表相关的操作 1.初始化 2.入队,当输入2时,还需要输入入队元素 3.出队 0.退出
测试输入: 1 2 a 2 b 3 3 3 0 预期输出: 成功对队列进行初始化 a已入队 b已入队 a已出队 b已出队 队列已空,无可出队元素
#include <iostream>
using namespace std;
#define MAXSIZE 5
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
typedef struct {
ElemType *base;
int front, rear, tag;
} SqQueue;
Status InitQueue(SqQueue &Q) {
//###### Begin ######
Q.base = new ElemType[5];
if (!Q.base)
return ERROR;
Q.front = Q.rear = 0;
Q.tag = 0;
return OK;
// ###### End ######
}
Status EnQueue(SqQueue &Q, ElemType e) {
//###### Begin ######
if (Q.tag == 1) {
Q.tag = 1;
return ERROR;
}
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % 5;
Q.tag = 2;
if (Q.front == Q.rear)
Q.tag = 1;
return OK;
// ###### End ######
}
Status DeQueue(SqQueue &Q, ElemType &e) {
//###### Begin ######
if (Q.tag == 0)
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % 5;
Q.tag = 2;
if (Q.front == Q.rear)
Q.tag = 0;
return OK;
// ###### End ######
}
main() {
SqQueue q;
int choose, flag;
ElemType j;
choose = -1;
while (choose != 0) {
cin >> choose;
switch (choose) {
case 1:
if (InitQueue(q)) {
flag = 1;
cout << "成功对队列进行初始化\n";
} else
cout << "初始化队列失败\n";
break;
case 2:
if (flag) {
flag = 1;
cin >> j;
if (EnQueue(q, j))
cout << j << "已入队\n";
else
cout << "队列已满,不可入队\n";
} else
cout << "队列未建立,请重新选择\n";
break;
case 3:
if (flag) {
flag = 1;
if (DeQueue(q, j))
cout << j << "已出队\n";
else
cout << "队列已空,无可出队元素\n";
} else
cout << "队列未建立,请重新选择\n";
break;
}
}
}