队列的顺序存储实现及基本操作
队列的顺序存储类型描述
#define MAXSIZE 10
typedef struct{
int data[MAXSIZE]; //存放队列元素
int front,rear; //队头指针和队尾指针
}SqQueue;
注意事项
-
顺序队列的队尾指针有两种情况,一种是将队尾指针指向队尾元素,一种是将队尾指针指向队尾元素的后一位(本文采取这种情况),两种情况在初始化时,前者为:front=0,rear=-1;后者为:front=rear=0。除此外,两种情况在判空、判满、入队、出队、计算队列长度时的操作都不一样。
-
在将将队尾指针指向队尾元素的后一位的情况下,计算队列长度有以下公式:
(rear+MAXSIZE-front)%MAXSIZE
-
顺序队列在实现过程中,运用到取模运算,将存储空间在逻辑上变为“环状”,形成循环队列的效果。
-
在判满、判空时有不同的几种方法:
(1).牺牲一个存储单元。本文采用的就是该方法,最大只能存储 MAXSIZE-1 个元素。详见代码描述。
(2).在定义结构体时,增加一个记录队列长度的 size 变量。初始化时,将size初始化为0,入队操作时+1,出队操作时-1。
(3).在定义结构体时,增加一个变量tag=0/1,记录最近一次操作是入队操作(tag=1)还是出队操作(tag=0)。这样,虽然判断条件都是(rear==font)
,但只有删除操作能导致队空,只有增加操作才能导致队满,判断条件变为:
(rear==font && tag==1)//判满条件
(rear==font && tag==0)//判空条件
源代码
#include<stdio.h>
#define MAXSIZE 10
typedef struct{
int data[MAXSIZE];
int front,rear;
}SqQueue;
void InitQueue(SqQueue &queue){
queue.front=0;
queue.rear=0;
}
bool QueueEmpty(SqQueue queue){
if(queue.front==queue.rear)
return true;
return false;
}
bool QueueFull(SqQueue queue){
if(queue.front==(queue.rear+1)%MAXSIZE)
return true;
return false;
}
bool EnQueue(SqQueue &queue,int e){
if(QueueFull(queue)){
return false;
}
queue.data[queue.rear]=e;
queue.rear=(queue.rear+=1)%MAXSIZE;
return true;
}
bool DeQueue(SqQueue &queue,int &de)
{
if(QueueEmpty(queue)){
return false;
}
de=queue.data[queue.front];
queue.front=(queue.front+1)%MAXSIZE;
return true;
}
bool GetHead(SqQueue queue,int &head)
{
if(QueueEmpty(queue)){
return false;
}
head=queue.data[queue.front];
return true;
}
void PrintQueue(SqQueue queue)
{
if(QueueEmpty(queue))
{
printf("队列为空!\n");
}
else{
printf("队列为:");
while((queue.front+1)%MAXSIZE!=queue.rear)
{
printf("\t%d\n",queue.data[queue.front]);
queue.front++;
}
printf("\t%d\n",queue.data[queue.front]); //这里还要打印一次
}
}
int QueueLen(SqQueue queue){
return (queue.rear+MAXSIZE-queue.front)%MAXSIZE;
}
int main()
{
SqQueue queue;
int head,de;
InitQueue(queue);
for(int i=1;i<11;i++)
{
if(!EnQueue(queue,i))
{
printf("队列满了\n");
}
}
printf("队列的长度:%d\n",QueueLen(queue));
PrintQueue(queue);
if(GetHead(queue,head)){
printf("对头元素为:%d \n",head);
}
if(DeQueue(queue,de)){
printf("出栈的元素是:%d\n",de);
}
if(DeQueue(queue,de)){
printf("出栈的元素是:%d\n",de);
}
if(GetHead(queue,head)){
printf("对头元素为:%d \n",head);
}
PrintQueue(queue);
printf("队列的长度:%d\n",QueueLen(queue));
return 0;
}
运行结果
the end…