C++数据结构——仅设尾指针的循环队列

题目描述

输入一个整数序列: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<iostream>
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<<" "<<qe.Pop();
			}else{
				ans = numToString(qe.Pop()); 
				flag++;
			}
		}
		cout<<ans<<endl;
	}
}

解题思路:
以前写队列都习惯了用c++的STL容器库的现成队列来写,今天常熟着自己写了一下,用类封装实现队列,主要是注意只有一个指针指向队尾,其实题目说了是一个循环链表,那么我们觉得可以结构体中设置两个指针,一个指向前驱一个指向后驱,这样子指向队尾的指针的前驱就变成了队头,这样子出入队列写起来可能会好一点
我这里没有用循环队列,所以出队列的时候我都是用循环找到队头进行输出,就比较麻烦,然后这个最后的输入要判断一下,判断是否满足条件在进行输出,我用了字符串拼接。
有问题请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祖安大龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值