您的位置:首页 > 其它

队列笔记

2015-08-09 20:43 197 查看
队列的用途:

先来先服务的原则:

订票系统,操作系统的作业调度,消息队列。

顺序队列

结构体中的数组用来存储入队的元素。

typedef struct

{
DATATYPE items[QUEUESIZE];
int front,rear;

}SqQueue;

顺序队列的溢出问题。

1:队列满时还要进行入队操作,rear会超出数组的下标。上溢。

2:队列空时还要出队操作,front会0-1=-1,非法下标,下溢。

3:满队之后出队,此时有空余位置,却不能通过入队来插入元素,这是假溢出。

综上的顺序队列的溢出问题,有循环队列来解决假溢出问题。

循环队列的指针运算:

front = (front + 1)%QUEUESIZE;

rear = (rear + 1)%UQEUESIZE;

在逻辑上把循环队列的首尾相连。通过队头队尾的指针运算实现。

区分循环队列队空还是队满的问题:

无论队空还是队满都存在front == rear,

方法一:
因为只有入队操作才会导致队满,只有出队操作才会导致队空。
所以设置一个标签,tag,用来标记前一个操作是入队还是出队。
入队为1,出队为0.
所以front == rear,tag == 1,队满。
   front == rear,tag == 0,队空。

方法二:
设置一个计数器count,计数队列中的元素数。
count == 0,队空
count == QUEUESIZE,队满

方法三:(这种方法的效率较高)
少用一个存储空间
此时当rear指向这个不用的存储空间时,表示队满。

链队列

不存在空间浪费。也不存在上溢出的问题。

链队列的数据结构方法:

#define DATATYPE int

typedef struct PNode

{
DATATYPE data;
PNode *next;

}LQNode;

typedef struct

{
LQNode *front,*rear;

}LinkQueue;

LQNode用来实现链

LinkQueue用来指向队头队尾。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: