输入一个整数序列:a1,a2,a3,…,an,进行入队或出队 *** 作。用数组Q[m](最多能放m个元素,本题设m=10)表示队列,并且设一个标志tag,以tag0和tag1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写相应的入队和出队等算法,并完成以下任务:对输入的ai,当ai>0时,将ai入队,若入队时队满则发生上溢“OVERFLOW”;当ai=0时,队头元素出队,若出队时队空则发生下溢“UNDERFLOW”。一旦发生上溢或下溢,则停止处理。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据首先输入一个正整数n(n≤30),再输入n个整数。
输出格式:
对于每组测试,若处理过程中既无上溢也无下溢,则依次输出队列中当前还存在的元素(每两个数据之间留一个空格),否则输出“OVERFLOW”或“UNDERFLOW”分别表示上溢或下溢(若最终队列为空,也输出“UNDERFLOW”)。
输入样例:
11 1 2 3 4 5 6 0 0 7 8 0
10 1 2 3 4 5 6 7 8 9 10
7 1 2 3 0 0 0 0
输出样例:
4 5 6 7 8
OVERFLOW
UNDERFLOW
解题代码
#include
using namespace std;
class Queue{
public:
void initQueue();
void push(int num);
int pop();
bool empty();
bool full();
private:
int rear;
int front;
int link[10];
};
void Queue::push(int num){
link[rear]=num;
rear=(rear+1)%10;
}
int Queue::pop(){
int data = link[front];
front=(front+1)%10;
return data;
}
void Queue::initQueue()
{
rear=front=0;
}
bool Queue::empty()
{
if(rear==front){
return true;
}
return false;
}
bool Queue::full()
{
if((rear+1)%10==front){
return true;
}else{
return false;
}
}
int main()
{
int n,num;
while(cin>>n){
Queue qu;
qu.initQueue();
int flag=0;
for(int i=0;i<n;i++){
cin>>num;
if(num>0&&flag==0){
if(!qu.full()){
qu.push(num);
}else{
flag=1;
}
}else if(num==0&&flag==0){
if(qu.empty()){
flag=-1;
}else{
qu.pop();
}
}
}
if(qu.empty()){
flag=-1;
}
if(flag==0){
int k=0;
while(!qu.empty()){
if(k==0){
cout<<qu.pop();
k=1;
}else{
cout<<" "<<qu.pop();
}
}
cout<<endl;
}else if(flag==-1){
cout<<"UNDERFLOW"<<endl;
}else{
cout<<"OVERFLOW"<<endl;
}
}
}
代码差不多,思路一样,就是损失一个空间什么意思,是长度依然为9但是空间给10个么
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)