任务描述
本关任务:假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、入队和出队等算法。
相关说明
输入数字代表相应的操作 1.初始化 2.入队 在输入2时,还需要输入入队的元素
3.出队 4.判断队列是否为空 0.退出
测试说明
测试输入: 1 2 a 2 b 3 3 3 4 0
预期输出: 初始化成功 a已入队 b已入队 a已出队 b已出队 队列已空,无可出队元素 此对为空队
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char QElemType;
typedef int Status;
typedef struct QNode {
QElemType data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct {
QueuePtr rear; //只设队尾指针
} LinkQueue;
void InitQueue(LinkQueue &Q) {//构造一个空队列Q
//###### Begin ######
QueuePtr x = new QNode;
x->next = x;
Q.rear = x;
// ###### End ######
}
int EmptyQueue(LinkQueue Q) {
//###### Begin ######
return Q.rear == Q.rear->next;
// ###### End ######
}
Status EnQueue(LinkQueue &Q, QElemType e) {
//###### Begin ######
QueuePtr x = new QNode;
x->data = e;
x->next = Q.rear->next; //循环队列;
Q.rear->next = x;
Q.rear = x;
return OK;
// ###### End ######
}
Status DeQueue(LinkQueue &Q, QElemType &e) {
//###### Begin ######
if (EmptyQueue(Q)) {
return ERROR;
}
QueuePtr x = Q.rear->next;
QueuePtr y = x->next;
e = y->data;
x->next = y->next;
if (x->next == x)
Q.rear = x;
free(y);
return OK;
// ###### End ######
}
main() {
int choose, flag = 0;
LinkQueue q;
QElemType j;
choose = -1;
while (choose != 0) {
cin >> choose;
switch (choose) {
case 1:
InitQueue(q);
flag = 1;
cout << "初始化成功\n";
break;
case 2:
if (flag) {
flag = 1;
cin >> j;
EnQueue(q, j);
cout << j << "已入队\n";
} else
cout << "队列未建立,请重新选择\n\n";
break;
case 3:
if (flag) {
flag = 1;
if (DeQueue(q, j))
cout << j << "已出队\n";
else
cout << "队列已空,无可出队元素\n";
} else
cout << "队列未建立,请重新选择\n\n";
break;
case 4:
if (EmptyQueue(q))
cout << "此对为空队\n";
else
cout << "此对不空\n";
break;
}
}
}