为什么静态队列必须是循环队列?

静态队列也就是用数组实现的队列,在非空队列中,头指针指向队头元素,尾指针指向队列尾元素的下一个位置,对于非循环队列来说,假设为队列分配的最大空间为6,当尾指针指向第7个元素的位置时,不可再继续插入新的队尾元素,否则会因数组越界而导致程序代码被破坏,而此时又不宜如顺序栈那样,进行存储再分配扩大数组空间。因为队列的实际可用空间并未占满,一个巧妙的方法是将顺序队列臆造为一个环状的空间,称为循环队列
数据结构之循环队列

如何判断循环队列空间是满还是空

可有两种方法:其一是另设一个标志位以区别队列是空还是满;其二是少用一个元素怒空间,约定以“队列透支很在队列为指着的下一位上作为呈满状态的标志”,常用的为第二种
数据结构之循环队列

什么时候用循环队列,什么时候用链式队列

如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度;若用户无法估计所用队列的最大长度,则宜采用连队列

循环队列出队和入队算法演示

数据结构之循环队列数据结构之循环队列

循环队列的实现

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX_QSIZE 5	//最大队列长度加一

//队列的顺序存储结构(循环队列)
typedef struct Queue
{
	int *base;	//初始化的动态分配存储空间
	int front;	//头指针,若队列不为空,指向队列头元素
	int rear;	//尾指针,若队列不为空,指向队列尾元素的下一个元素
}QUEUE,*PQUEUE;

void Init(PQUEUE pQ);	//构造一个空的循环队列
void Destroy(PQUEUE pQ);//销毁队列
void Clear(PQUEUE pQ);	//清空队列
bool Empty(PQUEUE pQ);	//判断队列是否为空
int Length(PQUEUE pQ);	//返回队列长度
bool GetHead(PQUEUE pQ,int *e);//用e保存队头元素
bool Enqueue(PQUEUE pQ,int val);//入队
bool Dequeue(PQUEUE pQ,int *e);//出队
void Traverse(PQUEUE pQ);//遍历队列元素

int main()
{
	int val;
	QUEUE Q;
	Init(&Q);
	printf("初始化成功!\n");
	Enqueue(&Q,1);
	Enqueue(&Q,2);
	Enqueue(&Q,3);
	Enqueue(&Q,4);
	GetHead(&Q,&val);
	printf("队头元素为:%d\n",val);
	Dequeue(&Q,&val);
	printf("出队的元素为:%d\n",val);
	Dequeue(&Q,&val);
	printf("出队的元素为:%d\n",val);
	GetHead(&Q,&val);
	printf("队头元素为:%d\n",val);
	if(Empty(&Q))
		printf("队列为空!\n");
	else
		printf("队列不为空!\n");
	Traverse(&Q);
	printf("队列的长度为:%d\n",Length(&Q));
	Clear(&Q);
	if(Empty(&Q))
		printf("队列为空!\n");
	else
		printf("队列不为空!\n");
	Destroy(&Q);
	return 0;
}

void Init(PQUEUE pQ)
{
	pQ->base = (int *)malloc(MAX_QSIZE*sizeof(int));
	if(pQ->base == NULL)
		exit(-1);
	pQ->front = 0;
	pQ->rear = 0;
}
void Destroy(PQUEUE pQ)
{
	pQ->base = NULL;
	pQ->front = 0;
	pQ->rear = 0;
}
void Clear(PQUEUE pQ)
{
	pQ->front = 0;
	pQ->rear = 0;
}
bool Empty(PQUEUE pQ)
{
	if(pQ->front == pQ->rear)
		return true;
	else
		return false;
}
int Length(PQUEUE pQ)
{
	return (pQ->rear - pQ->front + MAX_QSIZE)%MAX_QSIZE;
}
bool GetHead(PQUEUE pQ,int *e)
{
	if(Empty(pQ))
		return false;
	*e = pQ->base[pQ->front];
	return true;
}
bool Enqueue(PQUEUE pQ,int val)
{
	if((pQ->rear+1) % MAX_QSIZE == pQ->front)
		return false;
	pQ->base[pQ->rear] = val;
	pQ->rear = (pQ->rear + 1) % MAX_QSIZE;
	return true;
}
bool Dequeue(PQUEUE pQ,int *e)
{
	if(Empty(pQ))
		return false;
	*e = pQ->base[pQ->front];
	pQ->front = (pQ->front + 1) % MAX_QSIZE;
	return true;
}
void Traverse(PQUEUE pQ)
{
	int i = pQ->front;
	while(i != pQ->rear)
	{
		printf("%d	",pQ->base[i]);
		i = (i + 1) % MAX_QSIZE;
	}
	printf("\n");
}

相关文章: