循环队列的基本操作
2016-11-09 11:06
232 查看
一、循环队列的基本概念。
队列是线性表的一种,相对于栈的先进后出(FILO),队列是先进先出的(FIFO),因此只能在一端输入(队尾rear),在另一端输出(队头front)。
顺序队列的队头指向当前队列第一个元素的位置,队尾指向当前元素的下一个位置的下一个位置,但是当队满时不能入栈,
•存在问题
设数组长度为M,则:
–当front=0,rear=M时,再有元素入队发生溢出——真溢出
–当front!=0,rear=M时,再有元素入队发生溢出——假溢出
•解决方案
–队首固定,每次出队剩余元素向下移动——浪费时间
–循环队列
»基本思想:把队列设想成环形,让sq[0]接在sq[M-1]之后,若rear+1==M,则令rear=0;
队列的空间利用率不高,为了解决这个问题,采用循环队列,循环队列对空的条件是 rear==front,队满的条件是(rear+1)%size = front(这样会浪费一个空间)。
二、循环队列的源码
/*循环队列的操作:
1、初始化队列
2、入队
3、出队
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 5
struct que{
int data[SIZE];
int front;
int rear;
};
int init_queue(struct que* q)
{
memset(q->data, 0, sizeof(q->data));
q->front = 0;
q->rear = 0;
}
int in_queue(struct que* q, int data)
{
if((q->rear + 1)%SIZE == q->front){
printf("full queue. \n");
exit(1);
}
else {
q->data[q->rear] = data;
<span style="white-space:pre"> </span>(q->rear)=(q->rear+1)%SIZE;
}
}
int out_queue(struct que* q)
{
if(q->front == q->rear){
printf("queue is empty. \n");
exit(1);
}
else {
int tmp = q->data[q->front];
q->front = (q->front+1)%SIZE;
return tmp;
}
}
int main()
{
struct que Q;
init_queue(&Q);
in_queue(&Q, 11);
in_queue(&Q, 12);
in_queue(&Q, 13);
in_queue(&Q, 14);
int ret = out_queue(&Q);
printf("ret: %d\n", ret);
in_queue(&Q, 15);
in_queue(&Q, 16);
#if 0
ret = out_queue(&Q);
ret = out_queue(&Q);
in_queue(&Q, 14);
in_queue(&Q, 15);
in_queue(&Q, 16);
in_queue(&Q, 16);
int ret = out_queue(&Q);
ret = out_queue(&Q);
printf("ret: %d\n", ret);
ret = out_queue(&Q);
printf("ret: %d\n", ret);
ret = out_queue(&Q);
printf("ret: %d\n", ret);
#endif
return 0;
}
队列是线性表的一种,相对于栈的先进后出(FILO),队列是先进先出的(FIFO),因此只能在一端输入(队尾rear),在另一端输出(队头front)。
顺序队列的队头指向当前队列第一个元素的位置,队尾指向当前元素的下一个位置的下一个位置,但是当队满时不能入栈,
•存在问题
设数组长度为M,则:
–当front=0,rear=M时,再有元素入队发生溢出——真溢出
–当front!=0,rear=M时,再有元素入队发生溢出——假溢出
•解决方案
–队首固定,每次出队剩余元素向下移动——浪费时间
–循环队列
»基本思想:把队列设想成环形,让sq[0]接在sq[M-1]之后,若rear+1==M,则令rear=0;
队列的空间利用率不高,为了解决这个问题,采用循环队列,循环队列对空的条件是 rear==front,队满的条件是(rear+1)%size = front(这样会浪费一个空间)。
二、循环队列的源码
/*循环队列的操作:
1、初始化队列
2、入队
3、出队
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 5
struct que{
int data[SIZE];
int front;
int rear;
};
int init_queue(struct que* q)
{
memset(q->data, 0, sizeof(q->data));
q->front = 0;
q->rear = 0;
}
int in_queue(struct que* q, int data)
{
if((q->rear + 1)%SIZE == q->front){
printf("full queue. \n");
exit(1);
}
else {
q->data[q->rear] = data;
<span style="white-space:pre"> </span>(q->rear)=(q->rear+1)%SIZE;
}
}
int out_queue(struct que* q)
{
if(q->front == q->rear){
printf("queue is empty. \n");
exit(1);
}
else {
int tmp = q->data[q->front];
q->front = (q->front+1)%SIZE;
return tmp;
}
}
int main()
{
struct que Q;
init_queue(&Q);
in_queue(&Q, 11);
in_queue(&Q, 12);
in_queue(&Q, 13);
in_queue(&Q, 14);
int ret = out_queue(&Q);
printf("ret: %d\n", ret);
in_queue(&Q, 15);
in_queue(&Q, 16);
#if 0
ret = out_queue(&Q);
ret = out_queue(&Q);
in_queue(&Q, 14);
in_queue(&Q, 15);
in_queue(&Q, 16);
in_queue(&Q, 16);
int ret = out_queue(&Q);
ret = out_queue(&Q);
printf("ret: %d\n", ret);
ret = out_queue(&Q);
printf("ret: %d\n", ret);
ret = out_queue(&Q);
printf("ret: %d\n", ret);
#endif
return 0;
}
相关文章推荐