题目描述:
用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针)。实现该队列的入队出队以及判断队列是否为空操作。
输入:
多组数据,每组数据有两行。第一行为两个整数n和m,n表示入队序列A的长度(n个数依次连续入队,中间没有出队的情况),m表示出队序列B的元素数量(m个数依次连续出队,中间没有入队的情况)。第二行为序列A(空格分隔的n个整数)。当n和m都等于0时,输入结束。
输出:
对应每组数据输出一行。每行包括m+1个整数,前m个数代表出队序列B的各个整数,最后一个整数表示队列是否为空,队列为空输出0,不为空输出1。整数之间用空格分隔。
输入样例1:
5 3
1 3 5 3 6
4 4
-1 2 3 4
0 0
输出样例1:
1 3 5 1
-1 2 3 4 0
解题代码:
#include<iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next; //递归定义与LNode有相同含义的next指针
}LNode,*Queue;
void InitQueue(Queue& Q) { //初始化对列
Q = new LNode; //创建队列空间
Q->next = Q; //创建循坏对列
}
void PushQueue(Queue& Q, int e) { //将数据插入队列
Queue p = new LNode; //创建一个临时变量
p->data = e; //将数据赋给临时变量
p->next = Q->next; //链表尾插法
Q->next = p;
Q = p;
}
void PopQueue(Queue& Q) { //将数据出队
Queue q = Q->next->next; //循环对列的头,Q->next是头节点,Q->next->next是首元节点
cout << q->data << " "; //输出首元节点
Q->next->next = q->next; //删除掉首元节点,q不存在
if (q == Q) { //如果只剩头节点和首元节点
Q = Q->next; //删除掉首元节点之后的节点
}
delete q; //删除节点 先进先出原则
}
void InputQueue(Queue& Q) { //压入循环对列
int n, m;
while (cin >> n >> m && n != 0 && m != 0) {
InitQueue(Q); //每次输入重新创建队列
while (n--) { //压入队列
int e;
cin >> e;
PushQueue(Q, e);
}
while (m--) {
PopQueue(Q); //弹出队列
}
if (Q->next == Q) //头节点与尾节点重合,当队列为空时置0
cout << "0" << endl;
else
cout << "1" << endl; //头节点与尾节点不重合,当队列不为空时置1
}
}
int main() {
Queue Q;
InputQueue(Q);
return 0;
}