• 循环队列


     初稿:2017-11-19 14:12:20

    循环队列:本质是数组,采用循环方式,可以避免随着进队入队造成的空间浪费。

    知识点:N个连续的存储单元,第一个单元编号是0,最后一个单元是N-1; i代表任意一个单元的编号,++i % N能实现i的值从0走到N-1再自动回到0,依次循环往复。

    • 队空:rear == front; rear单元是空的,front是存在元素的
    • 队满:rear+1 == front;注意这种判满条件会造成一个存储单元的浪费。
    • 出队:front = (front + 1) % QUEUE_SIZE
    • 入队:rear = (rear + 1) % QUEUE_SIZE
    • 统计元素个数:((*Q).rear - (*Q).front + QUEUE_SIZE) % QUEUE_SIZE
     1 #include"头文件.h"
     2 #define QUEUE_SIZE 100//队列的容量
     3 typedef struct {
     4     int Q[QUEUE_SIZE];
     5     int front;
     6     int rear;
     7 }Queue;
     8 /*初始化队列,空队列*/
     9 void InitQueue(Queue *Q) {
    10     (*Q).front = 0;
    11     (*Q).rear = 0;
    12 }
    13 /*判空*/
    14 bool IsEmpty(Queue *Q) {
    15     return (*Q).front == (*Q).rear ? true : false;
    16 }
    17 /*判满*/
    18 bool IsFull(Queue *Q) {
    19     return (*Q).rear + 1 == (*Q).front ? true : false;
    20 }
    21 /*进队*/
    22 void EnterQueue(Queue *Q,int value) {
    23     if (IsFull(Q)) {
    24         printf("队列已满!
    "); return;
    25     }
    26     (*Q).Q[(*Q).rear] = value;
    27     (*Q).rear = ((*Q).rear + 1) % QUEUE_SIZE;
    28 }
    29 /*入队*/
    30 void OutQueue(Queue *Q, int *value) {
    31     if (IsEmpty(Q)) {
    32         printf("空队列,无法出队!
    "); return;
    33     }
    34     *value = (*Q).Q[(*Q).front];
    35     (*Q).front = ((*Q).front + 1) % QUEUE_SIZE;
    36 }
    37 /*统计队列元素个数*/
    38 int TotalNum(Queue *Q) {
    39     return ((*Q).rear - (*Q).front + QUEUE_SIZE) % QUEUE_SIZE;
    40 }
    41 int main() {
    42     Queue Q; int var;
    43     InitQueue(&Q);
    44     printf("1,2,3进队
    ");
    45     EnterQueue(&Q, 1);
    46     EnterQueue(&Q, 2);
    47     EnterQueue(&Q, 3);
    48     OutQueue(&Q, &var);
    49     printf("出队元素是%d
    ", var);
    50     printf("队列含有%d个元素
    ", TotalNum(&Q));
    51     system("pause");
    52     return 0;
    53 }

     

  • 相关阅读:
    储存过程、游标与触发器
    linux系统安装mysql5.7.22
    为什么实体类要实现序列化
    jsp的语法
    jsp的原理
    转发和重定向的区别
    SpringCloud——简介,5大组件
    Java——线程,并发包(Lock、线程池)
    Spring Data JPA——基本使用
    SpringBoot
  • 原文地址:https://www.cnblogs.com/joyeehe/p/7859666.html
Copyright © 2020-2023  润新知