循环队列(C++)

本文分享了作者在实现循环队列过程中遇到的问题及改进思路。通过对原始代码的反思,提出了减少循环、简化出入队列操作等优化方案,并对比了优秀示例代码,帮助读者更好地理解循环队列的设计原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前看了下队列的原理,信心满满马上写了个循环队列,与例程一对比才发现我这写的确实很垃圾。

我记录下例程对待问题的思想作个对比

1.我的代码中出现大量for循环,需要思考能否简化

2.出入队列过于冗杂,如下

// function with queue

/*
总结下类中的结构体 要用指针 
*/
#include<iostream>

using namespace std;
enum {maxsize = 100};

struct queue_s{
	int queue_list[maxsize];
	int rare, front;
}	Q1 ={{0}, 0, 0};

class queue{
	public:
		queue(queue_s *Q1)
		{
		    Q = Q1;
		}
		void in_queue(int mem)
		{
			if(Q->rare == Q->front && Q->queue_list[Q->rare] == -1)
			{
				Q->queue_list[(Q->rare)] = mem;
				
				//cout<<"1";
			}
			else if(Q->front - Q->rare == 1||Q->rare - Q->front==maxsize - 1)
			{
				//cout<<"满了!!"; 
			}
			else if(Q->rare == maxsize - 1)
			{
				Q->rare = 0;
				Q->queue_list[Q->rare] = mem;
				//cout<<"4";
			}
			else if(Q->rare == Q->front)
			{
				Q->queue_list[(Q->rare+1)] = mem;
				Q->rare += 1;
				//cout<<"2";
			}						
			else if(Q->rare < Q->front - 1)
			{
				Q->queue_list[Q->rare+1] = mem;
				Q->rare += 1;
				//cout<<"3";
			}
			else 	
			{
				Q->queue_list[(Q->rare+1)] = mem;
				Q->rare += 1;
				//cout<<"5";
			}
		}
		void out_queue()
		{
				if(Q->front == Q->rare)
				{
				cout<<"is empty\n";
			    Q->queue_list[Q->rare] = -1;
				}
				else if(Q->front!=maxsize-1)
				Q->front += 1;
				else 
				Q->front = 0;
		}
		
		void display()
		{
			int i = Q->front;
		    if(i>Q->rare)
			{
				for(;i<=maxsize-1;i++) 	cout<<Q->queue_list[i]<<" ";
				for(i= 0;i<=Q->rare;i++)   cout<<Q->queue_list[i]<<" ";
			}
			else{
			
			for(;(i!=Q->rare+1)&&((Q->queue_list[Q->rare] )!= -1); i++)
			{
				if(i == maxsize)
				i = 0;
			
				cout<<Q->queue_list[i]<<" ";
			}}
			cout<<"\n";
		}
		
		int theCount()
		{
			return Q->rare;
		}
		int theCount1()
		{
			return Q->front;
		}
		
	private:
		queue_s *Q;
		
};
 
 
int main()
{


    queue lin1(&Q1);
	int x=0,y;
	while(1)
	{
		
		if(x==1)
		{
			cin>>y;
			lin1.in_queue(y);
		}
		if(x==2)
		lin1.out_queue();
		else if(x==3)
		lin1.display();
		
		cout
		<<"\a当前队列在 "
		<< lin1.theCount()
		<<"区 "
		//<<lin1.theCount1()
	    <<"\n"
		<<"请输入以下数字:\n"
		<<"1:入队\n"
		<<"2:出队\n"
		<<"3:打印\n";
		cin>>x; 
	}
	
}

例程的入队算法

void InQueue(Queue * Q, DataType x)
{
	if(Q->rear+1)%MaxSize == Q->front)
	{
		printf("队列已满");
		exit(1); 
	}
	Q->rear = (Q->rear+1)%MaxSize;
	Q->data[Q->rear] = x;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值