您的位置:首页 > 其它

循环队列的基本操作

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: