zoukankan      html  css  js  c++  java
  • 3,数组模拟环形队列

    实现思路:

    1)设置队列头front=0指向数组第一个元素

    2)设置队列尾rear=0指向数组尾部的下一个元素,这时front==rear 队列为空

    3)队列首尾留出一个空位,方便程序理解是满还是空。判断队列满条件为(rear+1)%maxSize,留空位置是不断变化的

    4)队列有效数据计算公式,rear - front + maxSize % maxSize ,(这地方比较抽象,可以画个环形数组帮组理解)

      1 using System;
      2 
      3 namespace 数据结构
      4 {
      5     public class CircleQueue
      6     {
      7         //队列最大容量
      8         private int maxSize;
      9         //队列头
     10         private int front;
     11         //队列尾
     12         private int rear;
     13         //队列数组
     14         private int[] arrayQueue;
     15         //队列尾下一位置,如果和头部重合说明队列已满
     16         //所以队列尾部会空一个位置,这样判断队列是否为空好处理一些
     17         public bool IsFull { get => (rear + 1) % maxSize == front; }
     18         //头尾同时指向同一位置为空
     19         public bool IsEmpty { get => front == rear; }
     20         //队列剩余数据
     21         public int Size { get => (maxSize + rear - front) % maxSize; }
     22 
     23         public CircleQueue(int maxSize = 1)
     24         {
     25             //由于队列留空了一格,所以最大值要加一
     26             this.maxSize = maxSize + 1;
     27             arrayQueue = new int[this.maxSize];
     28             //指向队列头
     29             this.front = 0;
     30             //指向队列尾的下一个位置,也就三队列头部
     31             this.rear = 0;
     32         }
     33         //入队
     34         public bool AddQueue(int item)
     35         {
     36             if (IsFull)
     37             {
     38                 Console.WriteLine("队列已满...");
     39                 return false;
     40             }
     41             arrayQueue[rear] = item;
     42             //尾指向下一位置
     43             rear = (rear + 1) % this.maxSize;
     44             return true;
     45         }
     46         //出队
     47         public int GetQueue()
     48         {
     49             if (IsEmpty)
     50             {
     51                 throw new IndexOutOfRangeException("队列为空...");
     52 
     53             }
     54             //头指向下一位置
     55             var val = arrayQueue[front];
     56             front = (front + 1) % this.maxSize;
     57             return val;
     58         }
     59     }
     60 
     61     public class CircleQueueDemo
     62     {
     63         static void Main(string[] args)
     64         {
     65             //初始化队列
     66             var queue = new CircleQueue(9);
     67             Console.WriteLine($"当前队列长度为{queue.Size}");
     68             Console.WriteLine("向长度为9的入队10个数字
    ");
     69             for (int i = 1; i <= 10; i++)
     70             {
     71 
     72                 if (queue.IsFull)
     73                 {
     74                     Console.Write("队列已满“10”入队失败,");
     75                     break;
     76                 }
     77                 if (queue.AddQueue(i))
     78                 {
     79                     Console.Write($"{i}	");
     80                 }
     81 
     82             }
     83             Console.WriteLine($"当前队列长度为{queue.Size}	");
     84 
     85             //-----------------------------------------------------------
     86 
     87             Console.WriteLine("出队5个数字...
    ");
     88             for (int i = 1; i <= 5; i++)
     89             {
     90 
     91                 Console.Write($"{queue.GetQueue()}	");
     92 
     93             }
     94             Console.WriteLine($"当前队列长度为{queue.Size}
    ");
     95 
     96             //-----------------------------------------------------------
     97 
     98             Console.WriteLine("向队列队列插入10个数字...
    ");
     99             for (int i = 1; i <= 10; i++)
    100             {
    101                 if (queue.IsFull)
    102                 {
    103                     Console.Write("队列已满“6 7 8 9 10”入队失败,");
    104                     break;
    105                 }
    106                 if (queue.AddQueue(i))
    107                 {
    108                     Console.Write($"{i}	");
    109                 }
    110 
    111             }
    112             Console.WriteLine($"当前队列长度为{queue.Size}
    ");
    113 
    114             //-----------------------------------------------------------
    115 
    116             Console.WriteLine($"打印当前队列");
    117             var size = queue.Size;
    118             for (int i = 0; i < size; i++)
    119             {
    120                 Console.Write($"{queue.GetQueue()}	");
    121             }
    122             Console.WriteLine($"当前队列长度为{queue.Size}
    ");
    123         }
    124     }
    125 }
  • 相关阅读:
    java 数组转list的两种方式(可新增和删除list元素)
    SpringBoot配置404跳转页面的两种方式
    idea java常量字符串过长解决办法
    Spring-BeanValidation校验@RequestParam参数 (控制器单参数验证)
    【Java】使用@Valid+BindingResult进行controller参数校验
    Spring MVC利用Hibernate Validator实现后端数据校验
    springMvc 整合hibernate-validator(简单配置)
    vue中动态给自定义属性data-xx赋值并读取内容
    Tomcat配置SSL安全证书
    springmvc 接收json对象的两种方式
  • 原文地址:https://www.cnblogs.com/xiaojvhuang/p/12682225.html
Copyright © 2011-2022 走看看