数据结构—循环队列的实现

循环队列

  • 和顺序栈相类似,我们在队列的顺序存储结构中,附设两个指针front和rear分别指示队列首尾元素的位置。约定:初始化建空队列时,令front=rear=0。每当插入队尾元素时,尾指针加1;每当删除队首元素时,头指针加1。因此,在非空队列中,头指针始终指向队列首元素,尾指针始终指向队列尾元素的下一个位置。
  • 假设队列的最大空间为5,当我们删除又插入后,头指针或尾指针会越界,而此时队列的实际空间未占满。那么这时候我们就可以使用循环队列,当指针要越界时,将它再归为0,如此充分利用队列的空间。
  • 当使用循环队列时,我们需要判“空”和判“满” ,若以S.front=S.rear为判断条件,那么此时可能为空也可能为满。处理办法有两种:一是另设一个标志位来区别队列是空还是满;二是少用一个元素空间,约定以队列头指针在队列尾指针的下一位置上作为满的标志。
  • 以下是循环队列的实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

#define MAX_SIZE 5  //队列的最大长度 

typedef int elemType;

//循环队列的结构 
typedef struct{
	elemType* base;
	int front; //队首指针,删除队首元素,头指针加1 
	int rear;  //队尾指针,插入队尾元素,尾指针加1 
}SqQueue;

void initQueue(SqQueue& S);  //构造队列
int  getLength(SqQueue& S);  //获取元素个数 
void deleteElem(SqQueue& S); //队首删除元素
void insertElem(SqQueue& S,elemType data); //对尾插入元素 


void initQueue(SqQueue& S)
{
	S.base=(elemType*)malloc(sizeof(elemType)*MAX_SIZE);
	if(!S.base)  exit(1);
	else S.front=S.rear=0;  //空队列时,首位指针都为0 
}

int getLength(SqQueue& S)
{
	//以下的%MAX_SIZE是为了让它从头开始 
	return (S.rear-S.front+MAX_SIZE)%MAX_SIZE;
} 

void insertElem(SqQueue& S,elemType data)
{
	//先判断队列是否已满
	//留了一个元素位来判断是否已满,所以这里最多有MAX_SIZE-1个元素 
	if((S.rear+1)%MAX_SIZE==S.front) 
	{
		cout<<"队列空间已满,插入元素失败!"<<endl;
	} 
	else
	{
		S.base[S.rear]=data;
		cout<<"插入成功:"<<S.base[S.rear]<<endl;
		S.rear=(S.rear+1)%MAX_SIZE;
	}
} 

void deleteElem(SqQueue& S)
{
	if(S.front==S.rear) 
	{
		cout<<"空队列,删除元素失败!"<<endl;
	}  
	else
	{
		cout<<"删除了队首元素:"<<S.base[S.front]<<endl;
		S.front=(S.front+1)%MAX_SIZE;
	}
} 
 
int main()
{
	SqQueue S;
	initQueue(S);
	insertElem(S,5);
	insertElem(S,6);
	insertElem(S,7);
	insertElem(S,8);
	insertElem(S,9); 
	cout<<"\n此时队列共有"<<getLength(S)<<"个元素"<<endl; 
	deleteElem(S);
	deleteElem(S);
	cout<<"\n此时队列共有"<<getLength(S)<<"个元素"<<endl;  
	insertElem(S,3);
	insertElem(S,4);
	cout<<"\n此时队列共有"<<getLength(S)<<"个元素"<<endl;  
	return 0;
} 

运行结果:
/

发布了77 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42932834/article/details/91562291
今日推荐