仅设尾指针的循环队列问题 显示答案错误 帮忙看看哪里错了
仅设尾指针的循环队列 感觉思路没什么问题 但不知道哪里错了
输入一个整数序列:a 1 ,a 2 ,a 3 ,…,a n ,进行入队或出队操作。用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试编写相应的置空队、判队空、入队和出队等算法,并实现以下任务:对输入的a i,当a i>0时,将a i 入队;当a i=0时,队头元素出队,若出队时队空则发生下溢“UNDERFLOW”,一旦发生下溢,则停止处理。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据首先输入正整数n(n≤30),再输入n个整数。
输出格式:
对于每组测试,若处理过程中未发生下溢,则依次输出队列中当前还存在的元素(每两个数据之间留一个空格),否则输出“UNDERFLOW”表示下溢(若最终队列为空,也输出“UNDERFLOW”)。引号不必输出。
输入样例:
11 1 2 3 4 5 6 0 0 7 8 0
7 1 2 3 0 0 0 0
输出样例:
4 5 6 7 8
UNDERFLOW
```c++
#include<iostream>
using namespace std;
typedef int elemtype;
struct QNode{
elemtype data;
QNode *next;
};
struct LinkQueue{
QNode *rear;
void init();
void inqueue(elemtype e);
void outqueue();
bool empty();
};
void LinkQueue::init(){
rear=new QNode;
rear->next=rear;
}
void LinkQueue::inqueue(elemtype e){
QNode *p=new QNode;
p->data=e;
p->next=rear->next;
rear->next=p;
rear=p;
}
void LinkQueue::outqueue(){
if(rear==rear->next) return;
QNode *p=rear->next->next;
rear->next->next=p->next;
if(p==rear){
rear=rear->next;
}
delete p;
}
bool LinkQueue::empty(){
return rear==rear->next;
}
void solve(int n){
LinkQueue que;
que.init();
int t;
bool flag=true;
while(n--){
cin>>t;
if(t>0){
que.inqueue(t);
}else if(que.empty()!=true&&t==0){
que.outqueue();
}else{
cout<<"UNDERFLOW"<<endl;
flag=false;
}
if(flag==false) return;
}
int cnt=0;
QNode *p=que.rear->next->next;
while(p!=que.rear->next){
cnt++;
if(cnt>1){
cout<<" ";
}
cout<<p->data;
p=p->next;
}
cout<<endl;
}
int main(){
int n;
while(cin>>n){
solve(n);
}
}
```
题主代码的问题,如果最终队列为空,但未发生下溢,没有输出。这么改试试,供参考:
#include<iostream>
using namespace std;
typedef int elemtype;
struct QNode{
elemtype data;
QNode *next;
};
struct LinkQueue{
QNode *rear;
void init();
void inqueue(elemtype e);
int outqueue(); //void outqueue(); 修改
bool empty();
};
void LinkQueue::init(){
rear=new QNode;
rear->next=rear;
}
void LinkQueue::inqueue(elemtype e){
QNode *p=new QNode;
p->data=e;
p->next=rear->next;
rear->next=p;
rear=p;
}
int LinkQueue::outqueue(){ //void LinkQueue::outqueue() 修改
if(rear==rear->next) return 0; //修改
QNode *p=rear->next->next;
rear->next->next=p->next;
if(p==rear)
rear=rear->next;
delete p;
return 1; //修改
}
bool LinkQueue::empty(){
return rear==rear->next;
}
void solve(int n){
LinkQueue que;
que.init();
int t;
bool flag=true;
while(n--){
cin>>t;
if(t>0){
que.inqueue(t);
}
else if(t == 0){ //else if(que.empty()!=true&&t==0) 修改
if (!que.outqueue()) {
flag=false;
break;
}
}
//}else{
// cout<<"UNDERFLOW"<<endl;
// flag=false;
//}
//if(flag==false) return;
}
if (!que.empty() && flag) { //修改 队列不空且未发生下溢
int cnt=0;
QNode *p=que.rear->next->next;
while(p!=que.rear->next){
cnt++;
if(cnt>1)
cout<<" ";
cout<<p->data;
p=p->next;
}
cout<<endl;
}
else // 队列为空 或 发生下溢
cout<<"UNDERFLOW"<<endl;
}
int main(){
int n;
while(cin>>n){
solve(n);
}
return 0;
}