为什么静态队列必须是循环队列?
静态队列也就是用数组实现的队列,在非空队列中,头指针指向队头元素,尾指针指向队列尾元素的下一个位置,对于非循环队列来说,假设为队列分配的最大空间为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");
}