• java中队列实现


    队列的定义:

    队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。

    (1)允许删除的一端称为队头(Front)。

    (2)允许插入的一端称为队尾(Rear)。
    (3)当队列中没有元素时称为空队列。
    (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
       队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾,每次离开的成员总是队列头上的(不允许中途离队)。

    队列的存储结构及实现

    队列的顺序存储结构

    (1) 顺序队列的定义:

     队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

    (2)顺序队列的表示:

    和顺序表一样,顺序队列利用内存中一段连续的存储空间来存放当前队列中的元素。
    由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素,它们的初值在队列初始化时均应置为0。

     

    (3)顺序队列的基本操作

     1 public class JavaDemo<E> {
     2     E[] a;
     3     // 默认初始化大小
     4     private static final int DEFAULT_SIZE = 10;
     5     // 对首下标
     6     int front;
     7     // 队尾下标
     8     int rear;
     9 
    10     public JavaDemo() {
    11         this(DEFAULT_SIZE);
    12     }
    13 
    14     /**
    15      * 初始化指定长度的队列
    16      * @author Baorant
    17      * @param size
    18      */
    19     @SuppressWarnings("unchecked")
    20     public JavaDemo(int size) {
    21         a = (E[]) (new Object[size]);
    22         front = 0;
    23         rear = 0;
    24     }
    25 
    26     /**
    27      * 将一个对象追加到队列尾部
    28      * 
    29      * @param obj
    30      * @return 队列满时返回false,否则返回true
    31      * @author Baorant
    32      */
    33     public boolean enqueue(E obj) {
    34         if ((rear + 1) % a.length == front) {
    35             return false;
    36         } else {
    37             a[rear] = obj;
    38             rear = (rear + 1) % a.length;
    39             return true;
    40         }
    41     }
    42 
    43     /**
    44      * 队列头部出队
    45      * 
    46      * @return
    47      * 
    48      */
    49     public E dequeue() {
    50         if (rear == front)
    51             return null;
    52         else {
    53             E obj = a[front];
    54             front = (front + 1) % a.length;
    55             return obj;
    56         }
    57     }
    58 
    59     /**
    60      * 队列长度
    61      * @author Baorant
    62      * @return
    63      * 
    64      */
    65     public int size() {
    66         return (rear - front) % a.length;
    67     }
    68 
    69     // 队列长度(另一种方法)
    70     public int length() {
    71         if (rear > front) {
    72             return rear - front;
    73         } else
    74             return a.length - 1;
    75     }
    76 
    77     /**
    78      * 判断是否为空
    79      * @author Baorant
    80      * @return @
    81      */
    82     public boolean isEmpty() {
    83         return rear == front;
    84     }
    85 
    86     public static void main(String[] args) {
    87         JavaDemo<String> queue = new JavaDemo<String>(4);
    88         queue.enqueue("1");
    89         queue.enqueue("2");
    90         queue.enqueue("3");
    91         queue.enqueue("4");
    92         System.out.println("size = " + queue.size());
    93         int size = queue.size();
    94         System.out.println("*******出栈操作*******");
    95         for (int i = 0; i < size; i++) {
    96             System.out.print(queue.dequeue() + " ");
    97         }
    98     }
    99 }


    入队时:将新元素插入rear所指的位置的后一位。
    出队时:删去front所指的元素,然后将front加1并返回被删元素。

    (4)顺序表的溢出现象

     ①“下溢”现象
     当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。

    ② "真上溢"现象
    当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。

    ③ "假上溢"现象
    由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于内存中本分配的空间时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。如下图

     循环队列:

     如上图所示,这种头尾相接的顺序存储结构称为循环队列(circular queue)。

    循环队列中需要注意的几个重要问题:

    ①队空的判定条件,队空的条件是front=rear;

    ②队满的判定条件,(rear+1)%QueueSize=front。QueueSize为队列初始空间大小。

    循环队列的java实现代码

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/baorantHome/p/6944273.html
Copyright © 2020-2023  润新知