栈与队列之用java实现队列

队列

介绍:

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素成为出队。因为队列只允许在一段插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO-first in first out)线性表。

顺序队列中的溢出现象:

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

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

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

用java代码实现:

package com.chenyu.zuo.stackAndQueue;

public class QueueQ<T> {
      public int max;//队列的长度
      public T[] array;//队列实体
      public int rear;//队尾指针
      public int front;// 队头指针
      public int nItems;//元素的个数
      public QueueQ(int size){
      this.max=size;
      array=(T[])new Object[max];
      front=0;
      rear=-1;
      nItems=0;
      }
      public void insert(T t){  //插入队尾
      if(rear==max-1){ //已经实际队尾,从头开始
      rear=-1;
      }
      array[++rear]=t;
      nItems++;
      }
      public T delete(){//删除队头
      T t=array[front++];
      if(front==max){//队列到尾了
      front=0;
      }
      nItems--;
  return t;
      }
      public T peek(){ //查看对头
      return array[front];
      }
      public boolean IsEmpty(){ //是否为空
      return nItems==0;
      }
      public boolean isFull(){  //是否满了
      return nItems==max;
      }
      public int size(){ //队列的大小
      return nItems;
      }
      public  void showAll(){//打印出所有
      while(!IsEmpty()){
      System.out.println(delete());
      }
      }
public static void main(String[] args) {
      QueueQ theQueue = new QueueQ(5);   // 队列有5个元素

       theQueue.insert(10);             // 添加4个元素
       theQueue.insert(20);
       theQueue.insert(30);
       theQueue.insert(40);
       theQueue.delete();               // 移除3个元素
       theQueue.delete();               // (10, 20, 30)
       theQueue.delete();
       theQueue.insert(50);             // 添加4个元素
       theQueue.insert(60);
       theQueue.insert(70);
       theQueue.insert(80);
       theQueue.showAll();
}
}

结果:

40
    50
    60
    70
    80

 

(0)

相关推荐

  • Java队列篇之实现数组模拟队列及可复用环形队列详解

    像栈一样,队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端.就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人队 ...

  • Java并发队列和容器

    [前言:无论是大数据从业人员还是Java从业人员,掌握Java高并发和多线程是必备技能之一.本文主要阐述Java并发包下的阻塞队列和并发容器,其实研读过大数据相关技术如Spark.Storm等源码的, ...

  • JAVA中常见的阻塞队列详解

    在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...

  • PHP数据结构-栈和队列的应用

    栈和队列的应用 通过栈和队列的学习,我们似乎会感觉到其实数据结构还是非常简单的嘛.当然,这只是一个开始,我们从顺序表.链表开始,到现在的栈和队列,其实都是为了将来在铺路.在树和图的遍历算法中,都可以见 ...

  • ​LeetCode刷题实战225:用队列实现栈

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • 连吵架都是队列和栈,学计算机的女生,是一种怎样的存在?

    编辑 ∑Gemini 来源:德先生 曾小贤说:"这个世界上有三种人,男人,女人,女博士". 作为一个学计算机的女生,心酱想把这句话改一下. 大学里有三种学生,男大学生,女大学生,学 ...

  • 【原创】栈和队列的数据结构实现

    栈 #include<stdlib.h> struct stack{ int* number; int n; }; void init_stack(struct stack *s,int  ...

  • 每日一题 剑指offer(用两个栈实现队列)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • JavaScript数组 - 栈和队列方法

      栈方法  为了实现栈这个结构存在的方法 什么叫栈? 栈是古代的木盆,相当于现在的洗衣机:从同一个口进并且从同一个口出 如果要洗衣服拿出最底面的衣服必须要先拿出上面的衣服才可以 栈方法也是一样,先进 ...