题目描述
输入一个整数序列:a1, a2, a3,…,an,进行入队或出队 *** 作。
用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试编写相应的置空队、判队空、入队和出队等算法,并实现以下任务:对输入的ai,当ai>0时,将ai入队;当ai=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
using namespace std;
typedef int ElemType;
struct qNode{
ElemType data;
qNode *next;
};
class queue{
public:
void InitQueue();
ElemType Pop();
void Push(ElemType inputData);
void Clear();
bool Empty();
//void Top();
private:
qNode *rear;
};
void queue::InitQueue()
{
rear = new qNode();
rear->next=NULL;
}
ElemType queue::Pop()
{
qNode *p,*q;
if(rear->next==NULL){
return -1;
}
q=rear;
p=rear->next;
ElemType data;
while(p!=NULL){
if(p->next==NULL){
q->next=NULL;
data = p->data;
free(p);
break;
}
p=p->next;
q=q->next;
}
return data;
}
void queue::Push(ElemType inputData){
qNode *p = new qNode();
p->data=inputData;
p->next=rear->next;
rear->next=p;
}
void queue::Clear()
{
qNode *p;
while(rear->next!=NULL){
p=rear->next;
rear->next=p->next;
free(p);
}
}
bool queue::Empty()
{
if(rear->next==NULL){
return true;
}
return false;
}
string numToString(ElemType num){
string ans = "";
while(num){
char a = num%10+'0';
ans = a+ans;
num/=10;
}
return ans;
}
int main()
{
int n;
ElemType m;
while(cin>>n){
int flag = 0;
string ans = "";
queue qe;
qe.InitQueue();
for(int i=0;i<n;i++){
cin>>m;
if(m>0){
qe.Push(m);
}else{
if(!qe.Empty()){
qe.Pop();
}else{
ans = "UNDERFLOW";
//break;
}
}
}
if(qe.Empty()){
ans = "UNDERFLOW";
}
while(!qe.Empty()&&ans!="UNDERFLOW"){
if(flag){
ans = ans + " " + numToString(qe.Pop());
//cout<<" "<
}else{
ans = numToString(qe.Pop());
flag++;
}
}
cout<<ans<<endl;
}
}
解题思路:
以前写队列都习惯了用c++的STL容器库的现成队列来写,今天常熟着自己写了一下,用类封装实现队列,主要是注意只有一个指针指向队尾,其实题目说了是一个循环链表,那么我们觉得可以结构体中设置两个指针,一个指向前驱一个指向后驱,这样子指向队尾的指针的前驱就变成了队头,这样子出入队列写起来可能会好一点
我这里没有用循环队列,所以出队列的时候我都是用循环找到队头进行输出,就比较麻烦,然后这个最后的输入要判断一下,判断是否满足条件在进行输出,我用了字符串拼接。
有问题请指正。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)