根据给定的空间构造顺序循环队列,规定队满处理方法为少用一个元素空间。例如,给定5个元素空间构造循环队列,则只能存放4个元素。试根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出列操作后一次性全部出队的元素值。要求采用顺序队列完成,少用一个存储空间的方法区分队列的空和满。
输入的第一行为一个自然数n,表示要求构造的顺序循环队列空间数。 第二行为操作次k,接下来k行为出队入队操作,每行各代表一次操作。入队用in表示,出队用out表示,如果是入队,则in隔一空格后为一整数,表示入队元素值。
输出完成所有入队出队操作后,一次性出队元素。用一个空格隔开。可以假定队在完成所有操作后不为空。
-----------------------------------------------------------------
5 8
首先,我先粘一个AC代码吧,不得不说,之前的队列是在《啊哈算法》上看到的,但是那个队列和现在这个题比起来要稍逊一些,0965这个题比啊哈上要复杂一些;
贴代码前,我写了一个做队列题目的流程图吧:
队列
↓
队头,队尾<struct node>
↓
队列里的数据元素<struct node>
↓
初始化一个指针用来操作<void startQueue(Queue *&l)>,在里面同时初始化队头和队尾;
↓
入队→判满→不满则放数据,满就return;<这里是一个void入队>
↓
出队→判空→空则返回一个标记值(-1),不空则返回被删除的那个数,最后在main函数里用来输出最后剩下的数据
↓
int main()
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 1005
int n;
typedef struct node
{
int head,rear;//队列必须有队头和队尾;
char data[maxn];//把数据类型统一定义为字符型;
}Queue;
void startQueue(Queue *&l)
{
l=(Queue *)malloc(sizeof(Queue));
l->head=l->rear=0;//初始化队头和队尾;
}
void EnterQueue(Queue *&l,int dat)//入队操作;
{
if((l->rear+1)%n==l->head) return;//只允许放n-1个元素,此处为判断队列是否已满;
l->rear=(l->rear+1)%n;
l->data[l->rear]=dat;//如果所有的位置都可以放就不用rear+1;
}
int DeleteQueue(Queue *&l)
{
if(l->head==l->rear) return -100;
//队列里面什么都没有,删神马?
l->head=(l->head+1)%n;
int e=l->data[l->head];
return e;
}
int main()
{
int cnt;
Queue *q;
cin>>n>>cnt;
startQueue(q);
char order[20];
int data_;
while(cnt--)//输入cnt行;
{
cin>>order;
if(strcmp(order,"in")==0)
{
cin>>data_;
EnterQueue(q,data_);
}
else DeleteQueue(q);
}
for(int i=0;;i++)
{
int k=DeleteQueue(q);
if(k==-100) break;
else cout<<k<<" ";
}
//system("pause");
return 0;
}
------下面贴一个失败的代码,在我没有完全理解队列时写出来的失败产物,以此警示:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
typedef struct node
{
int data[1005];
struct node *next;
}Queue;
void createQueue(Queue *&Q,int num,int cnt)
{
void deleteQueue(Queue *&Q,int tar,int &nodeQ);
string order;
Q=(Queue *)malloc(sizeof(Queue));
Queue *p,*q;
p=Q;
int count=0;
int head=0,rear=0;
for(int i=0;i<cnt;i++)
{
q=(Queue *)malloc(sizeof(Queue));
cin>>order;
if(count==num-1)
{
count=0;
continue;
}
else if(order=="in")
{
cin>>q->data[rear];
rear++;
rear=rear%(num-1);
count++;
}
else if(order=="out")
{
head=head%(num-1);
head++;
continue;
}
p->next=q;
p=q;
}
p->next=NULL;
}
void Traverse(Queue *&Q,int num)
{
Queue *temp=Q;
for(int i=0;i<num-1;i++)
{
if(temp->data[i])
cout<<temp->data[i]<<" ";
}
}
int main()
{
int num,cnt;
Queue *queue;
while(cin>>num)
{
cin>>cnt;
getchar();getchar();
createQueue(queue,num,cnt);
Traverse(queue,num);
}
return 0;
}