C++ 循环队列

故事扮演 提交于 2020-01-03 20:05:20

在非空队列里,队首指针始终指向队头元素,而队尾指针始终指向队尾元素的下一位置。

顺序队列中存在“假溢出”现象。因为在入队和出队操作中,头、尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。因此,尽管队列中实际元素个数可能远远小于数组大小,但可能由于尾指针巳超出向量空间的上界而不能做入队操作。该现象称为假溢出。如下图所示是数组大小为5的顺序队列中队首、队尾指针和队列中元素的变化情况

在这里插入图片描述

为了解决假溢出问题,采用循环队列,看下图

在这里插入图片描述

入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,无法通过front=rear来判断队列“空”还是“满”。解决此问题的方法是:约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满。

即rear所指的单元始终为空。

判断是否队满(入队操作尾指针)

(q.rear+1)%MAX == q.front

q.rear = (q.rear+1)%MAX

在这里插入图片描述

判断是否队空(出队操作头指针)

q.front==q.rear

q.front = (q.front+1)%MAX

在这里插入图片描述

#include <iostream>
using namespace std;
#define MAX 5
//循环队列
struct Queue{
	int data[MAX];
	int front;//队首指针 
	int rear;//队尾指针 
}; 

//初始化队列
void init(Queue &q){
	q.front = q.rear = 0;
} 
//判断是否空
int isEmpty(Queue q){
	return q.front==q.rear;//0不是空 
} 
//入队
void enQueue(Queue &q, int ele){
	if( (q.rear+1)%MAX == q.front ){//牺牲掉一个空间 
		cout<<"队满---\n";
		return ;
	}
	q.data[q.rear] = ele;
	q.rear = (q.rear+1)%MAX;
} 
//出队
void deQueue(Queue &q, int &num){
	if(isEmpty(q)){//判断是否为空 W
		cout<<"队列为空---";
		return ;
	}
	num = q.data[q.front];
	q.front = (q.front+1)%MAX;
} 

int main(){
	
	Queue q;
	init(q);
	/*
		牺牲掉一个空间判断是否队满
		所以元素最多是 MAX-1个 
	*/
	for(int i=0; i<5; i++){
		enQueue(q,6);
	}

	for(int i=1; i<=5; i++){
		int num=0;
		deQueue(q,num);
		cout<<num<<" ";	
	}
	
	


	return 0;
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!