C++实现循环队列

本文介绍了队列的概念,对比了非循环队列与循环队列的特点,并详细阐述了循环队列的工作原理及其基本运算。通过C++实现了一个简单的循环队列类,包括初始化、销毁、判断队空、进队列及出队列等操作。

队列

队列(简称队)是一种操作受限的线性表,其限制为仅允许在表的一端进行插入,而在表的另一端进行删除。一般情况下,将进行插入的一端称为队尾,将进行删除的一端称为对头或队首。向队列中插入新元素称为进队或入队,新元素进队后就成为新的队尾元素;从队列中删除元素称为出队或离队,元素出队后,其直接后继元素就成为队首元素。由于队列的插入和删除操作分别是在表的一端进行的,每个元素必然按照进入的次序出队,所以又把队列称为先进先出表。

非循序队列和循环队列

  1. 非循环队列:
    元素进队时队尾指针rear增1,元素出队时队头指针front增1,当进队MaxSize个元素后,满足队满的条件(rear==MaxSize-1),此时即使出队若干元素,队满条件仍成立(实际上队列中有空位置,因为它的判断标准是rear的大小,但是rear只在进队后增1),这是一种假溢出。

  2. 循环队列:
    把数组的前端和后端连接起来,形成一个循环的顺序表,即把存储队列元素的表从逻辑上看成一个环,称为循环队列(也称环形队列)。

循环队列原理

循环队列首尾相连,当队首指针front=MaxSize-1后,再前进一个位置就自动到0,这可以用求余运算(%)来实现。

  1. 队首指针进1:front=(front+1)%MaxSize
  2. 队尾指针进1:rear=(rear+1)%MaxSize
  3. 循环队列的队头指针和队尾指针初始化都置0,即front=rear=0。在进队元素或出队元素时,队尾或队头指针循环前进一个位置。
  4. 循环队列为空的条件是rear==front。
  5. 通常约定在进队时少用一个数据元素空间,以队尾指针加1等于队首指针作为队满的条件,即(rear+1)%MaxSize==front。

循环队列的基本运算

定义一个Sqqueue类

#include <iostream>
using namespace std;
#define MAXSIZE 6

class Sqqueue{
	public:
		Sqqueue();
		~Sqqueue();
		bool SqqueueEmpty();
		bool enQueuek(char e);
		bool deQueuek(char &e);
		void out();
	private:
		char* data;
		int front,rear;
};

循环队列的初始化和销毁

Sqqueue::Sqqueue(){
	data = new char[MAXSIZE];///为data分配空间
	front = rear = 0;//将队头、队尾指针置初值
}

Sqqueue::~Sqqueue(){
	delete [] data;
}

判断队列是否为空

bool Sqqueue::SqqueueEmpty(){
	return front==rear;
}

进队列

bool Sqqueue::enQueuek(char e){
	if((rear+1)%MAXSIZE == front){
		cout << "队满上溢出!" << endl;
		return false;
	}else{
		rear = (rear+1)%MAXSIZE;//将队尾指针rear循环增1
		data[rear] = e;//将元素e放在该位置
		cout << "入队成功!" << endl;
		return true;
	}
}

出队列

bool Sqqueue::deQueuek(char &e){
	if(front==rear){
		cout << "队空下溢出!" << endl;
		return false;
	}else{
		front = (front+1)%MAXSIZE;//将队首指针front循环增1
		e = data[front];//将元素e放在该位置
		return true; 
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值