郝斌老师数据结构9(循环队列)

    技术2022-07-10  191

    队列

    定义:一种可以实现先进先出的存储结构

    分类:

    链式队列:链表实现

    静态队列:数组实现,静态队列通常必须是循环队列,减少内存浪费。

    链式队列:与链表类同,实现略

    循环队列:

    循环队列需要两个参数来确定:

           1.front(队头)

           2.rear(队尾)

    循环队列的几个定义解释:

           1.队列初始化:front和rear均为0

           2.队列非空:front指向队列第一个元素下标,rear指向队列最后一个元素的下一个元素下标

           3.队列为空:front == rear,但是不一定为0

    入队伪算法:

           1.将值存入r所代表的位置

           2.将r后移,正确写法:rear=(rear+1)%数组长度  错误写法:rear=rear+1

    出队伪算法:

           front=(front+1)%数组长度

    判断循环队列为空

           如果front与rear相等,则队列一定为空

    判断队列为满

           (rear+1)%数组长度==front

    #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define Maxsize 6 typedef struct Queue { int* pBase; int front; int rear; }QUEUE; void init(QUEUE* q); bool en_queue(QUEUE* q, int val); bool is_full(QUEUE* q); bool is_empty(QUEUE*); void traverse(QUEUE*); bool out_queue(QUEUE*, int*); int main(void) { int val; QUEUE Q; init(&Q); en_queue(&Q, 1); en_queue(&Q, 2); en_queue(&Q, 3); en_queue(&Q, 4); en_queue(&Q, 5); en_queue(&Q, 6); en_queue(&Q, 7); traverse(&Q); out_queue(&Q, &val); printf("出队元素:%d\n", val); out_queue(&Q, &val); printf("出队元素:%d\n", val); traverse(&Q); out_queue(&Q, &val); out_queue(&Q, &val); out_queue(&Q, &val); out_queue(&Q, &val); traverse(&Q); return 0; } void init(QUEUE* q) { q->pBase = (int*)malloc((sizeof(int) * Maxsize)); q->front = 0; q->rear = 0; return; } bool is_full(QUEUE* q) { //这里设定队列中满时有一个元素不用,(rear+1)%size=front时队列满 if ((q->rear + 1) % Maxsize == q->front) return true; else return false; } bool en_queue(QUEUE* q, int val) { if (is_full(q)) { printf("队列已满!入队失败\n"); return false; } q->pBase[q->rear] = val; q->rear++; return true; } bool is_empty(QUEUE* q) { if (q->rear == q->front) return true; else return false; } void traverse(QUEUE* q) { if (is_empty(q)) { printf("队列为空\n"); return; } int i = 0; for (i = q->front; i != q->rear; i = (i+1)%Maxsize) { printf("%d ", q->pBase[i]); } printf("\n"); return; } bool out_queue(QUEUE* q, int* val) { if (is_empty(q)) { printf("队列为空\n"); return false; } *val = q->pBase[q->front]; q->front++; return true; }

     

    Processed: 0.043, SQL: 9