顺序队列图示:
由于顺序的非环状的队列不能很好地判断队列是否为满,造成假溢出的现象,因此引入循环队列很好地解决了这一问题
循环队列图示:
1.循环队列牺牲一个存储空间来区分队满和队空(牺牲一个存储空间只是其中一种解决方案),最大存储空间为 Maxsize-1;
2.队满条件: (q->rear+1)%Maxsize ==q->front
3.对空条件:q->front==q->rear
4.队中元素的个数: num=(q->rear-q->front+Maxsize)%Maxsize;
源代码如下:
SqQueue.h
//顺序存储队列
#define Maxsize 6
#define Elemtype int
typedef struct{
Elemtype data[Maxsize]; //数据域
Elemtype front,rear; //头尾指针
}Queue;
//函数声明
Queue InitQueue(); //队列初始化
void printQueue(Queue *q); //打印队列
void EnQueue(Queue *q,Elemtype e); //入队操作
Elemtype DeQueue(Queue *q); //出队操作
SqQueue.c
//队列的顺序存储
#include "SqQueue.h"
#include <stdio.h>
#include<stdlib.h>
int main()
{
int n=1;
Queue q;
q=InitQueue();
printQueue(&q);
while(n!=0)
{
printf("\t\t/\n");
printf("\t\tinput your choice \n");
printf("\t\t1.En Queue \n");
printf("\t\t2.De Queue \n");
printf("\t\t/\n");
scanf("%d",&n);
switch(n)
{
int m,p;
case 1: printf("1.input the elem you want to push\n");
scanf("%d",&m);
EnQueue(&q,m);
printQueue(&q);
break;
case 2: p=DeQueue(&q);
printf(" 元素 %d 出队列! \n",p);
printQueue(&q);
break;
default:
break;
}
}
return 0;
}
Queue InitQueue() //队列初始化
{
Queue q ;
int n,m,i;
q.front=0;
q.rear=0;
printf("input the numble of elem you want to add\n");
scanf("%d",&n);
printf("input the elem \n");
for(i=0;i<n;i++)
{
scanf("%d",&m);
q.data[i]=m;
q.rear++;
printf("队尾指针:%d\n",q.rear);
}
return q;
}
void EnQueue(Queue *q,Elemtype e)//入队操作
{
//判断队满
if((q->rear+1)%Maxsize ==q->front)
{
printf("the queue is full!\n");
}else{
q->data[q->rear]=e;
q->rear=(q->rear+1)%Maxsize; //队尾指针进一
printf("队尾指针:%d\n",q->rear);
}
}
Elemtype DeQueue(Queue *q) //出队操作
{
//判断队空
int head;
if(q->front==q->rear)
{
printf("the queue is empty!\n");
return NULL;
} else{
head=q->front;
q->front=(q->front+1)%Maxsize; //队首元素进一
return q->data[head];
}
}
void printQueue(Queue *q) //打印队列
{
int i,num,n;
printf("print the Queue!\n");
/*
for( i=q->front;i<q->rear;i++) //传统的遍历法,行不通
{
printf("%d ",q->data[i]); //
}
*/
//打印得到元素的个数 ,传统的遍历行不通
num=(q->rear-q->front+Maxsize)%Maxsize;
for(i=q->front,n=0;n<num;n++,i=(i+1)%Maxsize)
{
printf("%d ",q->data[i]);
}
printf("\n");
printf("此时的队首指针:%d\n",q->front);
printf("此时的队尾指针:%d\n",q->rear);
printf("\n");
}
//其他队列常见的基本操作如判断队空队满,读队头元素等包含在上面的代码中,没有单独写成函数了