数据结构之队列
一、队列定义(实现“先入先出”的存储结构)
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
二、队列分类
链式队列:类似栈中定义的pTop&pBottom,在链式队列中定义pFront(队列头)&pRear(队列尾)
静态队列:用数组实现,通必须是循环队列
循环队列:
1.静态队列为什么必须是循环队列:必须循环才能利用好数组内存空间
2.循环队列需要几个参数来确定:front & rear
3.循环队列各个参数的含义
在不同场合有不同的含义;
1)初始化:front & rear 都为零
2)队列不空:front指向队列首个元素,rear指向队尾元素的下一个无效元素
3)队列空:front & rear 相等,但是不一定为零
4.循环队列入队伪算法
1)元素存入rear指向的位置;
2)rear = (rear+1)% 数组长度
5.循环队列出对伪算法讲解
front = (front+1)% 数组长度
6.如何判断循环队列为空:front = rear
7.如何判断循环队列是否已满
两种方式:
1)多增加一个标志参数
2)少使用一个元素-->front和rear挨着
if( (rear+1)% 数组长度 == front )
已满
else
不满
三、代码实现
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct Queue{ int * pBase; int front; int rear; }QUEUE; void init(QUEUE *); bool empty(QUEUE *); bool full(QUEUE *); bool in_queue(QUEUE *,int val); bool out_queue(QUEUE *,int * pVal); void traverse(QUEUE *); int main(void) { QUEUE Q; int val; int *pVal = &val; init(&Q); in_queue(&Q,1); in_queue(&Q,2); in_queue(&Q,3); in_queue(&Q,4); in_queue(&Q,5); in_queue(&Q,6); in_queue(&Q,7); traverse(&Q); if(out_queue(&Q,pVal)) { printf("出队元素为:%d\n",*pVal); }else{ printf("出队失败\n"); } traverse(&Q); return 0; } //***********init()初始化******************* void init(QUEUE * pQ) { pQ->pBase = (int *)malloc(sizeof(int)*6); pQ->front = 0; pQ->rear = 0; } //***********empty()判断是否为空******************* bool empty(QUEUE * pQ) { if(pQ->front == pQ->rear) { return true; }else{ return false; } } //***********full()判断是否满了******************* bool full(QUEUE * pQ) { if((pQ->rear+1)%6 == pQ->front) { return true; }else{ return false; } } //***********in_queue()入队******************* bool in_queue(QUEUE * pQ,int val) { if(full(pQ)) { return false; }else{ pQ->pBase[pQ->rear] = val; pQ->rear = (pQ->rear+1)% 6; return true; } } //***********out_queue()出队******************* bool out_queue(QUEUE * pQ,int * pVal) { if(empty(pQ)) { return false; }else{ * pVal = pQ->pBase[pQ->front]; pQ->front = (pQ->front+1)% 6; return true; } } //***********traverse()遍历******************* void traverse(QUEUE * pQ) { int i = pQ->front; while(i != pQ->rear) { printf("%d ",pQ->pBase[i]); i = (i+1)% 6; } }