一、队列实现的难点
队列实现主要在于如何判断队空和队满;
(1)队空:判断队空是十分简单的,如果队首等于队尾,队则空;
(2)队满:队空的标准是队首等于队尾,但队是可以循环使用的,当数组元素占满,队尾又回到了队首的位置,队满的判断标准此时也是队首等于队尾,很明显,这个方法是行不通的。
二、队列的实现思路
1、队列是一种线性结构,遵循着先进先出的原则,我采用数组来实现队列
2、队列有队首(front),队尾(rear)两个标志,队尾控制数据入队,队首控制数据出队
3、实现队满的方法也很简单,就是在数组中空出一个元素。当队尾和队首之间只有一个空的位置,我们就认为队列处于满的状态,以区分与队空的判断条件。同时我们还需要注意两个要点;
一、队尾始终是我们要入队的位置,队首始终是要出队的位置;
二、空出的位置没有数据。
三、代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//队的结构体
typedef struct
{
int *data;//数据域,本质是数组的指针
int front;//对首,本质是数组的下标
int rear;//队尾,本质也是数组的下标
int len;//队的长度,这我就不解释了
}Queue;
//队的初始化
Queue *init(int l)
{
Queue* q=(Queue *)malloc(sizeof(Queue));//给队的结构体申请空间
q->data=malloc(l*sizeof(int));//给数组申请空间,数组长为l
q->front=0;
q->rear=0;
q->len=l;
return q;
}
//判断队是否为空
int empty_Queue(Queue *q)
{
return q->rear==q->front;//队首等于队尾,则队为空
}
//判断队是否满
int full_Queue(Queue *q)
{
return (q->rear+1)%(q->len)==q->front;//队尾+1对队的长度取余等于队首,则队为满
}
//入队
int in_Queue(Queue *q,int val)
{
if(full_Queue(q))//队满则无法入队
{
return -1;
}
q->data[q->rear]=val;
q->rear++;//队尾+1
q->rear=q->rear%q->len;//队尾对队的长度取余,以免队尾超出队长
return 1;
}
//出队
int out_Queue(Queue *q)
{
if(empty_Queue(q))
{
return -1;
}
int temp;
temp=q->data[q->front];
q->front++;//同入队
q->front=q->front%q->len;//同入队
return temp;
}
int main()
{
//测试
int l,i,o;
printf("请输入队的长度:");
scanf("%d",&l);
Queue *q=init(l);
for(i=0;i<l;i++)
{
int num;
printf("请输入入队的数据:");
scanf("%d",&num);
if(in_Queue(q,num)==-1)
{
printf("入队失败,队已满!\n");
}
}
for(i=0;i<l;i++)
{
printf("出队的数据:");
o=out_Queue(q);
if(o==-1)
printf("队空!\n");
else
printf("%d\n",o);
}
}