队列是规定一头只进、另一头只出的线性结构。其一般由循环队列实现,这样可以使得存储空间固定且快捷。
因此需要申请一段固定的空间,设定队头front和队尾rear。
入队操作是队头添加一个元素front+1,出队操作是队尾去除一个元素rear+1。
初始条件(空队):规定front和rear在同一个位置,front == rear。
一般状态:rear位于队尾元素的后一个位置,即下一个新入队元素的位置。
队满状态:(rear+1)%n == front。
- # include<stdio.h>
- # include<string.h>
- # include<malloc.h>
- #define N 6
- typedef struct Queue
- {
- /* data */
- int *pBase;
- int front;
- int rear;
- }QUEUE;
- void initQueue(QUEUE *pQueue)
- {
- pQueue->pBase = (int *)malloc(sizeof(int)*N);
- pQueue->front = 0;
- pQueue->rear = 0;
- return;
- }
- bool isFull(QUEUE *pQueue)
- {
- if( (pQueue->rear + 1)%N == pQueue->front )
- return true;
- else
- return false;
- }
- bool isEmpty(QUEUE *pQueue)
- {
- if(pQueue->front == pQueue->rear)
- return true;
- else
- return false;
- }
- bool enQueue(QUEUE *pQueue, int value)
- {
- if(isFull(pQueue))
- {
- printf("QUEUE is Full.\n");
- return false;
- }
- else
- {
- pQueue->pBase[pQueue->rear] = value;
- pQueue->rear = (pQueue->rear+1)%N;
- return true;
- }
- }
- bool outQueue(QUEUE *pQueue, int *pvalue)
- {
- if(isEmpty(pQueue))
- {
- printf("QUEUE is Empty.\n");
- return false;
- }
- else
- {
- *pvalue = pQueue->pBase[pQueue->front];
- pQueue->front = (pQueue->front+1)%N;
- return true;
- }
- }
- void traverseQueue(const QUEUE *pQueue)
- {
- int i = pQueue->front;
- printf("The QUEUE: ");
- while(i != pQueue->rear)
- {
- printf("%d ", pQueue->pBase[i]);
- i = (i+1)%N;
- }
- printf("\n");
- return;
- }
- int main()
- {
- int out;
- QUEUE mq;
- initQueue(&mq); //这里的实参都是用引用类型
- enQueue(&mq, 10);
- enQueue(&mq, 8);
- traverseQueue(&mq);
- outQueue(&mq, &out);
- traverseQueue(&mq);
- }
队列的应用:和先后顺序有关的场景,比如BFS,消息,进程管理。