数据结构之队列

mac2022-06-30  72

一、队列定义(实现“先入先出”的存储结构)

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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; } } View Code

 

转载于:https://www.cnblogs.com/ljd4you/p/9584040.html

最新回复(0)