队列笔记

队列的用途:
先来先服务的原则:
订票系统,操作系统的作业调度,消息队列。


顺序队列
结构体中的数组用来存储入队的元素。
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用来指向队头队尾。

你可能感兴趣的:(嵌入式,linux开发)