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

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

题目描述

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



有问题请指正。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存