栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

浅谈C++实现队列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈C++实现队列

队尾添加,队首删除(排队,先到先出)

循环队列 基本思路

数组+指针实现,需要指定队列长度。

前期准备:

1.需要两个指针:队首(front)、队尾(rear)指针

front永远指向队头元素前一位置,front之后才是第一结点

2.循环链接首尾

队列长度:Qsize

(rear+1)%Qsize==front

3.通过C++类实现功能封装

class CirQueue{
	public:
		CirQueue();
		~CirQueue();
		void add(int x); 	//入队 
		int chu();			//出队 
		int get();			//取队首元素 
		int empty();		//判空 
		void print(); 
	private:
		int front ,rear;			//front永远指向队头元素前一位置。front之后才是第一结点 
		int data[Qsize];   			//数组存储循环队列 
};

基本操作思路:

1.添加在队尾进行,rear后移之后加数据

2.出队在队首进行,front后移以使第一结点后移

注意:

1.队空:前、后指针相等.即:front==rear

2.队满:牺牲一个空间 .即:(rear+1)%Qsize==front

功能实现 构造函数
CirQueue::CirQueue(){
	front=rear=-1;		//front 指向队列元素前
} 
入队
void CirQueue::add(int x){
	//先判断队满:牺牲一个空间  
	if((rear+1)%Qsize==front) throw"队满" ;
	//在队尾加入元素
	rear= (rear+1)%Qsize;			
    //尾指针后移,在新位置插入元素 
	data[rear]=x;
}
出队
int CirQueue::chu(){
	//队首出队  
	if(front==rear) throw"队空!";
	front=(front+1)%Qsize;			//front最初指向队头元素前一位置。头指针后移,使得原来的的队首元素出队 
	return data[front]; 			
}
判空
int CirQueue::empty(){
	//队空条件:前、后指针相等 
	if(front==rear) return 1; 
		else return 0; 
}
取队首元素
int CirQueue::get(){
	if(front==rear) throw"队空!";
	return  data[(front+1)%Qsize];	//取队首元素 
}
遍历队列
void CirQueue::print(){
	cout<<"当前队列中的所有元素为:";
	for(int i=front+1;i<=rear;i++) cout< 
完整代码 
#include
using namespace std;
const int Qsize=10;
class CirQueue{
	public:
		CirQueue();
		~CirQueue();
		void add(int x); 	//入队 
		int chu();			//出队 
		int get();			//取队首元素 
		int empty();		//判空 
		void print(); 
	private:
		int front ,rear;			//front永远指向队头元素前一位置。front之后才是第一结点 
		int data[Qsize];   			//数组存储循环队列 
};
CirQueue::CirQueue(){
	front=rear=-1;					//front 指向队头元素前一位置。
} 
CirQueue::~CirQueue(){}
void CirQueue::add(int x){
	//先判断队满:牺牲一个空间  
	if((rear+1)%Qsize==front) throw"队满" ;
	//在队尾加入元素
	rear= (rear+1)%Qsize;			//尾指针后移,在新位置插入元素 
	data[rear]=x;
}
int CirQueue::chu(){
	//队首出队  
	if(front==rear) throw"队空!";
	front=(front+1)%Qsize;			//front最初指向队头元素前一位置。头指针后移,使得原来的的队首元素出队 
	return data[front]; 			
}
int CirQueue::empty(){
	//队空条件:前、后指针相等 
	if(front==rear) return 1; 
		else return 0; 	
}
int CirQueue::get(){
	if(front==rear) throw"队空!";
	return  data[(front+1)%Qsize];	//取队首元素 
}
void CirQueue::print(){
	cout<<"当前队列中的所有元素为:";
	for(int i=front+1;i<=rear;i++) cout< 
链队列 

1.front永远指向队头元素前一位置,front之后才是第一结点

2.判断条件与循环对相同

队空:前、后指针相等.即:front==rear

类的声明
class linkQueue
{
public:	
linkQueue( ); 		//构造函数,初始化空链队列
~linkQueue( ); 		//析构函数,释放链队列各结点的存储空间
void EnQueue(int x); 		//入队操作
DataType DeQueue( ); 		//队首元素出队
DataType GetQueue( ); 		//取链队列的队头元素
int Empty( ); 				//判空
private:
Node *front, *rear; 
    			//队头和队尾指针,分别指向头结点和队尾结点
};
功能实现 构造

队头指针和队尾指针都均指向头结点s

int :: linkQueue( )
{
Node *s = nullptr;
s = new Node; s->next = nullptr; //创建头结点s
front = rear = s; 		//队头指针和队尾指针都指向头结点s
}
入队

链表实现存储,无需判断队满

void linkQueue :: EnQueue(int x)
{
Node *s = nullptr;
s = new Node; 				//辅助结点s
s->data = x; s->next = nullptr;
rear->next = s; rear = s; 	//将结点s插入队尾
}
出队

需要判断队空: rear == front

int linkQueue :: DeQueue( )
{
int x;
Node *p = nullptr;
if (rear == front) throw "队空";		
p = front->next; x = p->data; //暂存队头
front->next = p->next;		 //队头摘链
if (p->next == nullptr) rear = front; 
    				//判断出队的元素是否为队列中最后一个元素
delete p;
return x;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347917.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号