队列(FIFO)
队列是只允许在一端进行插入,另一端进行删除的线性表
场景:
1.鼠标的点击事件。
2.键盘输入,显示器的输出
3.打客服电话,进行排队。
。。。
数组队列(数组循环队列)*
数组加两个下标
队列长度:(rear-front +maxsize)%maxszie; //这里rear指向的一般是空的
队列满:(rear+1)%maxsize == front;
队列空:rear ==front;
#define maxsize 10
typedef int DataType;
typedef struct
{
DataType data[maxsize];//容量
int front;//头 下标
int tail;
}sqQueue;
//=====================初始化队列
bool InitQueue(sqQueue *queue)
{
int front = 0 ;
int tail = 0;
return true;
}
//======================队列的长度
int Len_Queue(sqQueue *queue)
{
return (queue.front-queue.tail + maxsize) % maxsize;
}
//======================入队列=====从数组尾插入 tail+1
bool access_Queue(sqQueue *queue, Datatype elem)
{
if((queue.tail+1)%maxsize == queue.front)//队列满
return false;
else
{
queue->data[queue.tail] = elem;
queue->tail=(queue->tail+1)%maxsize;//%size的目的是若到最后转到数组的头
return true;
}
}
//=====================出队列------从头部取 front+1
bool exit_Queue(sqQueue *queue, Datatype *elem)
{
if(queue.front == queue.tail)//队列为空
return false;
else
{
*e=queue->data[queue.front];
queue->front=(queue->front+1)%maxsize;
return true;
}
}
//其实你可以看到,通过下标来读值等,实际上里面夹杂着很多的覆盖操作
链式队列(链式单链表)*
front节点 指向队列的头结点, 队尾指向队列的尾结点
note:在空队列 front和tail都只指向头结点
typedef int DataType;
typedef struct QNode//节点
{
DataType val;
struct QNode *next;
}QNode;
typedef struct
{
QNOde *front;
QNOde *rear;
}LinkQueue;
*//============入队列====尾巴插
bool access_Queue(LinkQueue *queue, DataType elem)
{
QNode *qnode=(QNode *)malloc(sizeof(QNode));
if(!qnode)//分配失败
return false;
qnode->val=elem;
qnode->next=NULL;//表明只是最后一个节点
queue->rear->next = qnode;//新节点接在屁后==========节点----为了遍历
queue->rear=qnode;//把当前的节点设为队尾节点======链队列,-----为了保持一个关系
return true;
}
//===================出队列---
bool exitQueue(LinkQueue *queue, DataType *elem)
{
if(queue->front == queue->rear)//为空
return false;
QNode *qnode;//做临时节点,用于保存操作时的值
qnode=queue->front->next;//要删除的头结点地址暂存给qnode
*elem =qnode->val;
queue->front->next=qnode->next;
if(queue->rear == qnode)//头结点和尾节点地址重合
queue->rear=queue->front;//变为了空队列
return true;
}