• 队列java实现


    队列是一种线性数据结构,是一种运算受限的线性表,只允许在队尾插入,在队头删除。运算规则是先进先出。恰好和栈相反。栈是先进后出。因为栈只在栈顶做删除和插入。

    队列按照存储结构可以分为顺序队列和链式队列。顺序队列采用数组实现,链式队列采用节点的方式实现。

    //顺序队列

     1 package queue;
     2 //1.队列是一种运算受限的线性表,运算规则是先进先出。只能在队头和队尾进行操作
     3 //2.队列由数据域,队头,队尾组成
     4 //3.队列在队尾进行插入操作,在队头进行删除操作
     5 public class Queue<E> {
     6     private Object[] data = null; //数据域
     7     private int front = 0;           //队头,允许删除
     8     private int rear = 0;           //队尾,允许插入
     9     private int maxSize = 0;       //队列容量
    10     
    11     //初始化队列
    12     public Queue(){
    13         this(10);
    14     }
    15 
    16     public Queue(int initialSize) {
    17         if(initialSize >= 0){
    18             this.data = new Object[initialSize]; //初始化数据域
    19             this.maxSize = initialSize;
    20         }else {
    21             throw new RuntimeException("初始化大小不能小于0:" + initialSize);
    22         }
    23     }
    24     
    25     //判断队列是否为空
    26     public boolean isEmpty(){
    27         return this.front == this.rear; //如果队头队尾相等说明为空
    28     }
    29     
    30     //判断队列是否已满
    31     public boolean isMaxSize(){
    32         return this.rear == this.maxSize ? true : false; //如果队尾指针大于最大容量,说明队列已经满了
    33     }
    34     
    35     //入队,从队尾插入,从队头删除
    36     public boolean push(E e){
    37         //判断队列是否已满
    38         if(this.isMaxSize()){
    39             System.err.println("队列已满,无法插入");
    40             return false;
    41         }
    42         data[rear] = e; //将元素插入到队尾 data[0] = 插入值
    43         rear++ ; //更新队尾指针
    44         return true;
    45     }
    46     
    47     //弹出队列
    48     @SuppressWarnings("unchecked")
    49     public E pop(){
    50         //判断是否为空,为空将无法出队
    51         if(isEmpty()){
    52             System.err.println("队列为空,无法插入");
    53             return null;
    54         }
    55         //在队头弹出
    56         E e = (E) data[front]; //对头引用
    57         data[front] = null; //将弹出的对头内存销毁
    58         front ++; //更新队头指针为后面的一位元素
    59         return e;
    60     }
    61     
    62     //返回队首元素,但不删除
    63     @SuppressWarnings("unchecked")
    64     public E peek(){
    65         if(isEmpty()){
    66             System.err.println("队列为空");
    67             return null;
    68         }
    69         
    70         return (E) this.data[front];
    71     }
    72     
    73     //遍历队列
    74     public void display(){
    75         while(front < rear){
    76             System.out.println(data[front]);
    77             front ++;
    78         }
    79     }
    80     
    81     //返回队列实际长度
    82     public int getSize(){
    83         return this.data.length;
    84     }
    85     
    86     public static void main(String args[]){
    87         Queue<Integer> queue = new Queue<Integer>();
    88         int i = 0;
    89         while(i < 10){
    90             queue.push(i);
    91             i ++;
    92         }
    93 //        queue.pop();
    94         queue.display();
    95     }
    96 
    97 }

    //链式队列

      1 package queue;
      2 
      3 //链式队列,由队头和队尾节点组成,节点中包含数据域和指针域
      4 public class LinkedQueue<E> {
      5     //1.定义队列结构
      6     //节点类
      7     @SuppressWarnings("hiding")
      8     private class Node<E>{
      9         public E data = null; //数据域
     10         public Node<E> next = null; //指针域
     11         
     12         //构造方法
     13         @SuppressWarnings("unused")
     14         public Node(){}
     15         
     16         public Node(E data, Node<E> next){
     17             this.data = data;
     18             this.next = next;
     19         }
     20         
     21     }/*Node*/
     22     
     23     private Node<E> front = null; //队头
     24     private Node<E> rear  = null; //队尾
     25     private int size = 0;         //队列长度
     26     
     27     //2.判断队列是否为空
     28     public boolean isEmpty(){
     29         return size == 0;
     30     }
     31     
     32     //3.入队
     33     public boolean push(E e){
     34         Node<E> node = new Node<E>(e, null);
     35         //队列为空的情况下
     36         if(isEmpty()){
     37             this.rear = node; //尾节点赋值为新插入的节点
     38             this.front = this.rear; //在只有一个节点的情况下,头尾节点相等
     39             size++;
     40             return true;
     41         }
     42         //不为空的情况下
     43         this.rear.next = node; //尾节点指向新节点
     44         this.rear = node; //更新尾节点
     45         size ++; //队列节点数+1
     46         return true;
     47     }
     48     
     49     //4.出队
     50     public E pop(){
     51         //判断队列是否为空
     52         if(isEmpty()){
     53             System.err.println("队列为空");
     54             return null;
     55         }
     56         //弹出队头,更新队头指针
     57         Node<E> temp = this.front; //获取队头引用
     58         this.front = this.front.next; //更新队头指针
     59         temp.next = null; //释放原队头节点引用
     60         return temp.data;
     61         
     62     }
     63     
     64     //5.返回队头但不删除
     65     public E peek(){
     66         //判断是否为空
     67         if(isEmpty()){
     68             System.err.println("为空,不能返回");
     69             return null;
     70         }
     71         return this.front.data;
     72     }
     73     
     74     //6.求长
     75     public int getSize(){
     76         return this.size;
     77     }
     78     
     79     //7.打印队列
     80     public void display(){    
     81         for (int i = 0; i < this.size; i++) {
     82             if(this.front == null){
     83                 return;
     84             }
     85             System.out.println(this.front.data);
     86             this.front = this.front.next;
     87         }
     88     }
     89     
     90     public static void main(String args[]){
     91         LinkedQueue<Integer> queue = new LinkedQueue<Integer>();
     92         //1.入队
     93         int i = 0;
     94         while(i < 10){
     95             queue.push(i);
     96             i++;
     97         }
     98         
     99         //出队
    100         int j = 0;
    101         while(j < 8){
    102             System.out.println(queue.pop());
    103             j ++;
    104         }
    105         
    106         
    107 //        queue.display();
    108         
    109     }
    110     
    111 
    112 }
  • 相关阅读:
    复利计算(1)
    对IT行业的一些思考
    递归下降语义分析
    1118 实验三 有限自动机的构造与识别
    冒泡排序文法评论
    实验0:了解和熟悉操作系统
    0302思考IT行业的感想
    递归下降语义分析
    对文法解释和语法树的评论
    语言文法
  • 原文地址:https://www.cnblogs.com/liaohai/p/6523013.html
Copyright © 2020-2023  润新知