仅设尾指针的循环队列问题 显示答案错误

仅设尾指针的循环队列问题 显示答案错误 帮忙看看哪里错了

img

仅设尾指针的循环队列 感觉思路没什么问题 但不知道哪里错了
输入一个整数序列: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;
}