队列:一种操作受限的线性表,只允许一段插入,而在另一端进行删除。
队头:允许删除的一端
队尾:允许插入的一端
1.队列中入队时要少用一个处理单元
(1)初始时:Q.front = Q,rear = 0
(2)队首指针进1:Q.front = (Q.front+1)%maxsize
(3)队尾指针进1:Q,rear = (Q.rear+1)%maxsize
(4)队列长度:(Q.rear-Q.front+maxsize)%maxsize
初始化
//初始化
void InitQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
判断空:Q.front与Q.rear指向的是队列同一个位置,说明出队和入队是相同的,则队列为空
//判断空
bool isEmpty(SqQueue &Q)
{
if(Q.front == Q.rear)
return true;
else
return false;
}
入队:因为最开始是设置Q.front与Q.rear都为0,每一次入队一个元素之后Q.rear就是指向入队元素后面一个位置,若是整个队满了,这是Q.rear指向最后一个入队元素的后面,这时候Q.rear = 0,而Q.front也为0,这时和队空条件一致,所以无法判断,故留一个队列单元
//入队
bool enQueue(SqQueue &Q, int s)
{
if(Q.front == (Q.rear+1)%maxsize)
return false;
Q.data[Q.rear] = s;
Q.rear = (Q.rear+1)%maxsize;
return true;
}
出队
//出队
int DeQueue(SqQueue &Q, int &s)
{
if(Q.front == Q.rear)
return 9999;
s = Q.data[Q.front];
Q.front = (Q.front+1)%maxsize;
return s;
}
遍历输出:因为队列是从队头出去,所以最开始令i = Q.front,当其不等于Q.rear时就一个一个的输出,因为入队之后队列的排序就是从队头到队尾,顺序也是从Q.front到Q.rear。故以i !=Q.rear为结束循环条件
//遍历输出
void traverse(SqQueue &Q)
{
int i = Q.front;
while(i != Q.rear)
{
printf("%d ",Q.data[i]);
i = (i+1)%maxsize;
}
}
运行结果:maxsize设置为5,此时结果为4个
2.类型中增设表示元素个数的数据成员,其余的和1是差不多的
(1)队空条件为Q.size = 0
(2)队满条件为Q.size = maxsize
此时这两种情况都为Q.front = Q.rear
初始化
//初始化
void InitQueue(SqQueue &Q)
{
Q.front = Q.rear = Q.size = 0;//最开始使其全部为0
}
判断空
//判断空
bool isEmpty(SqQueue &Q)
{
if(Q.size == 0)//因为其是用来记录队列中元素个数,为0则为空
return true;
else
return false;
}
入队
//入队
bool enQueue(SqQueue &Q,int s)
{
if(Q.size == maxsize)//加入Q.size目的就是不会浪费队列中的一个单元,当其为maxsize则说明队列已经满了可以结束
return false;
else
{
Q.data[Q.rear] = s;
Q.rear = (Q.rear+1)%maxsize;
Q.size++;
}
return true;
}
出队
//出队
int DeQueue(SqQueue &Q, int &s)
{
if(Q.size == 0)//为0的时候队列为空
return 9999;
else
{
s = Q.data[Q.front];//用此记录出队的数
Q.front = (Q.front+1)%maxsize;
Q.size--;
}
return s;
}
遍历输出:注意此时i是如何变换的
//遍历输出
void traverse(SqQueue &Q)
{
int i = Q.front;//队列是从表头出的
while(i != maxsize)
{
printf("%d ",Q.data[i]);
i++;//若也是i = (i+1)%maxsize这种格式,就不会出现等于maxsize,会出错。
}
printf("\n");
}
运算结果:maxsize设置为5,此时输出结果有5个
1.的完整代码
#include<stdio.h>
#define maxsize 5
typedef struct
{
int data[maxsize];
int front,rear;
}SqQueue;
//函数说明
void InitQueue(SqQueue &Q);//初始化
bool isEmpty(SqQueue &Q);//判断空
bool enQueue(SqQueue &Q, int s);//入队
int DeQueue(SqQueue &Q, int &s);//出队
void traverse(SqQueue &Q);//遍历输出
int main(void)
{
SqQueue Q;
int s,val;
InitQueue(Q);
enQueue(Q,1);
enQueue(Q,2);
enQueue(Q,3);
enQueue(Q,4);
enQueue(Q,5);
enQueue(Q,6);
enQueue(Q,7);
printf("入队之后队列中元素为:");
traverse(Q);
val = DeQueue(Q,s);
printf("出队元素为:%d\n",val);
printf("出队之后队列中元素为:");
traverse(Q);
return 0;
}
//初始化
void InitQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
//判断空
bool isEmpty(SqQueue &Q)
{
if(Q.front == Q.rear)
return true;
else
return false;
}
//入队
bool enQueue(SqQueue &Q, int s)
{
if(Q.front == (Q.rear+1)%maxsize)
return false;
Q.data[Q.rear] = s;
Q.rear = (Q.rear+1)%maxsize;
return true;
}
//出队
int DeQueue(SqQueue &Q, int &s)
{
if(Q.front == Q.rear)
return 9999;
s = Q.data[Q.front];
Q.front = (Q.front+1)%maxsize;
return s;
}
//遍历输出
void traverse(SqQueue &Q)
{
int i = Q.front;
while(i != Q.rear)
{
printf("%d ",Q.data[i]);
i = (i+1)%maxsize;
}
}
2.的完整代码
#include<stdio.h>
#define maxsize 5
typedef struct
{
int data[maxsize];
int front,rear;
int size;//用来表示队列中元素个数
}SqQueue;
//函数说明
void InitQueue(SqQueue &Q);
bool isEmpty(SqQueue &Q);
bool enQueue(SqQueue &Q,int s);
int DeQueue(SqQueue &Q, int &s);
void traverse(SqQueue &Q);
int main(void)
{
SqQueue Q;
int val,s;
InitQueue(Q);
enQueue(Q,1);
enQueue(Q,2);
enQueue(Q,3);
enQueue(Q,4);
enQueue(Q,5);
enQueue(Q,6);
printf("入队之后队中元素为:\n");
traverse(Q);
val = DeQueue(Q,s);
printf("出队元素为:%d\n",val);
printf("出队之后队列元素为:\n");
traverse(Q);
return 0;
}
//初始化
void InitQueue(SqQueue &Q)
{
Q.front = Q.rear = Q.size = 0;//最开始使其全部为0
}
//判断空
bool isEmpty(SqQueue &Q)
{
if(Q.size == 0)//因为其是用来记录队列中元素个数,为0则为空
return true;
else
return false;
}
//入队
bool enQueue(SqQueue &Q,int s)
{
if(Q.size == maxsize)//加入Q.size目的就是不会浪费队列中的一个单元,当其为maxsize则说明队列已经满了可以结束
return false;
else
{
Q.data[Q.rear] = s;
Q.rear = (Q.rear+1)%maxsize;
Q.size++;
}
return true;
}
//出队
int DeQueue(SqQueue &Q, int &s)
{
if(Q.size == 0)//为0的时候队列为空
return 9999;
else
{
s = Q.data[Q.front];//用此记录出队的数
Q.front = (Q.front+1)%maxsize;
Q.size--;
}
return s;
}
//遍历输出
void traverse(SqQueue &Q)
{
int i = Q.front;//队列是从表头出的
while(i != maxsize)
{
printf("%d ",Q.data[i]);
i++;//若也是i = (i+1)%maxsize这种格式,就不会出现等于maxsize,会出错。
}
printf("\n");
}