仅设尾指针的循环队列 感觉思路没什么问题 但不知道哪里错了
输入一个整数序列: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
#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 getFront();
};
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,int a[]){
LinkQueue que;
que.init();
for(int i=0;i<n;i++){
if(a[i]>0){
que.inqueue(a[i]);
}else if(que.empty()!=true&&a[i]==0){
que.outqueue();
}
}
if(que.empty()==true){
cout<<"UNDERFLOW"<<endl;
}else{
int cnt=0;
cout<<1111;
for(int i=0;i<n;i++){
cnt++;
if(cnt!=1){
cout<<" ";
}
cout<<a[i];
}
}
}
int main(){
int n;
while(cin>>n){
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
solve(n,a);
}
}
代码如下,希望采纳
#include <iostream>
using namespace std;
const int N = 35;
struct Queue
{
int e[N];
int tail; // 队尾指针
};
void InitQueue(Queue& q) // 初始化队列
{
q.tail = 0;
}
bool IsEmpty(Queue q) // 判队空
{
return q.tail == 0;
}
bool IsFull(Queue q) // 判队满
{
return q.tail == N - 1;
}
bool EnQueue(Queue& q, int x) // 入队
{
if (IsFull(q)) return false;
q.e[q.tail] = x;
q.tail = (q.tail + 1) % N;
return true;
}
bool DeQueue(Queue& q, int& x) // 出队
{
if (IsEmpty(q)) return false;
x = q.e[0];
for (int i = 1; i < q.tail; i++)
q.e[i - 1] = q.e[i];
q.tail--;
return true;
}
int main()
{
int n;
while (cin >> n)
{
Queue q;
InitQueue(q);
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
if (x > 0) EnQueue(q, x);
else
{
int y;
if (DeQueue(q, y)) cout << y << " ";
else
{
cout << "UNDERFLOW" << endl;
break;
}
}
}
if (IsEmpty(q)) cout << "UNDERFLOW" << endl;
else
{
for (int i = 0; i < q.tail; i++)
cout << q.e[i] << " ";
cout << endl;
}
}
return 0;
}