顺序循环队列的基本操作

顺序循环队列是一种常见数据结构,所以今天我特地整理了一下,后面还会补上链表队列的实现,见我的博客数据结构栏目


1.先上几个头文件部分,里面是一些基本的定义

#include //source.h
#include 
using namespace std;
#define ERROR 0   //definition.h
#define OK 1
#define INIT_SIZE 100
typedef int ElemType;
typedef int Status;
typedef struct queue
{
	ElemType *base;//数组首地址
	int front,rear;//一个头下标,一个尾下标
}Queue;
2.下面是各种基本操作了,我写在function.h里,由于比较简单,我就直接把他们放了上来,没有一个函数一个函数介绍

Status InitQueue(Queue &Q)
{
	Q.base = (ElemType *)malloc(INIT_SIZE*sizeof(ElemType));
	if (!Q.base)
	{
		cout<<"内存分配失败"<
3.下面是主函数部分,没什么亮点

#include "source.h"
#include "definition.h"
#include "function.h"

void main()
{
	int choice;
	ElemType value;
	ElemType head,data;
	Queue Q;
	Q.base = NULL;
	while (1)
	{
		cout<<"顺序循环队列的基本操作"<>choice;
		switch(choice)
		{
		case 1:
			if (InitQueue(Q))
			{
				cout<<"初始化成功"<>value;
			EnQueue(Q,value);
			break;
		case 5:
			cout<<"					正在执行。。。。。"<
注意:虽然整个程序没什么亮点,但是还是有几点需要注意,那就是在写入队列函数也就是Enqueue()函数时,要判断队列是否满了,但是这里判断队列是否满了的代码是(Q.rear+1)%INIT_SIZE == Q.front,这里不能直接用前面写的IsFull()函数来作为条件,如果用isfull判断的话,会有一有关函数调用的问题,大家可以试一试,学习学习。

还有就是大家可能会疑问,判断队列满((Q.rear+1)%INIT_SIZE==Q.front)与判断队列空(Q.front==Q.rear)的条件。

大家都知道队列是尾进头出的结构,所以这就会导致尾部下标达到了最大值,实际上头部前面可能还有空间没有被使用,所以这就会达到所谓的假溢出状态,解决办法就是让下标达到了最大值过后,再让Q.rear的值重新回到0,也就是这段连续空间的最开始,这就形成了我们今天说的顺序循环队列,那么表满的条件是什么呢?你可能会认为是Q.rear==Q.front,但是Q.rear==Q.front也是队列为空的判断依据(如果按照这种方式判断的话,就会不准确),所以大佬们就想出了空出最后一个存储单元,来实现判断队列是否满了,那就是判断,(Q.rear+1)%INIT_SIZE==Q.front,这样就可以区分了。

附上一张图片:

顺序循环队列的基本操作_第1张图片
顺序循环队列的基本操作_第2张图片
顺序循环队列的基本操作_第3张图片

每天进步一点点

你可能感兴趣的:(顺序循环队列的基本操作)