线性表——队列(java实现)

原创 2018年04月15日 20:24:41

一,队列

队列也是一种线性表——受限的线性表,队列的数据操作是:插入数据在表的一端进行,称为队尾,删除数据在表的另一端进行,称为队首。队列是一种先进先出的数据结构。队列也可以采用两种方式来实现,即顺序表(顺序队列)和链表(链队列),这里我采用链表来实现,另外我还采用了数组实现的方式。


二,链表实现

public class MyQueue<T> {
    private MyLinkedList<T> queue;  //使用聚合方式实现队列,用链表存储数据
    public MyQueue()    //初始化链表
    {
        queue = new MyLinkedList<T>();
    }
    public boolean addFront(T data)//调用链表的add方法在队尾添加元素
    {
        return queue.add(data);
    }
    public T remove()   //调用链表的remove方法,删除队首元素
    {
        return queue.remove(0);
    }
    public T peek()//调用链表的get方法,获取队首元素
    {
        return queue.get(0);
    }
    public boolean isEmpty()//调用链表的isEmpty判断队列是否为空
    {
        return queue.isEmpty();
    }
}

MyLinkedList类详情可以参考文章:
https://blog.csdn.net/YIXIANG0234/article/details/79949967

三,测试

import static java.lang.System.*;
public class TestMyQueue {
    public static void main(String[] args) {
        MyQueue<String> queue = new MyQueue<String>();
        queue.addFront("李白");
        queue.addFront("杜甫");
        queue.addFront("白居易");
        queue.addFront("杜牧");
        queue.addFront("李商隐");
        out.println("队首元素是:"+queue.peek());
        while(!queue.isEmpty())
        {
            out.println(queue.remove());
        }
    }
}

运行结果:

队首元素是:李白
李白
杜甫
白居易
杜牧
李商隐

四,数组实现队列

采用数组来实现队列,定义两个变量front,rear分别指向队首和队尾,在队首删除元素,在队尾插入元素。但是简单的顺序队列会造成假溢出问题,解决这个问题的办法是采用循环队列,即将数组的头指针和尾指针连起来。
定义front,rear,maxSize(队列的容量)即数组大小
队列操作条件
队空:front=rear
队满:(rear+1)%maxSize = front
元素进队:rear = (rear+)%maxSize
元素出队:front = (front+)%maxSize

public class ArrayQueue<T> {
    private int front;//队首指针,表示出队的方向
    private int rear;//队尾指针,表示入队的方向
    private int maxSize;//表示队列的容量
    private Object[] data;//用来存储队列数据的Object数组

    /*队列操作条件
     队空:front=rear
     队满:(rear+1)%maxSize = front
     元素进队:rear = (rear+)%maxSize
     元素出队:front = (front+)%maxSize
     * */

    public ArrayQueue(int size)
    {
        if(size>0)
            maxSize =size;
        maxSize++;      //很重要,因为循环队列中最大装入元素的个数是maxSize-1个
        data = new Object[maxSize]; //要想装入size个元素maxSize必须加一
        front = rear = 0;//front=rear表示队空
    }
    public ArrayQueue()
    {
        this(10);//队列默认大小为10
    }
    public boolean addFront(T myDate)
    {
        if(isFull())
            throw new RuntimeException("队列已满,无法再插入新数据!");
        data[rear] = myDate;
        rear = (rear+1)%maxSize;//入队条件
        return true;
    }
    @SuppressWarnings("unchecked")
    public T remove()
    {
        if(isEmpty())
            throw new RuntimeException("队列已空,无数据可以删除!");
        T olddata = (T) data[front];
        front = (front+1)%maxSize;//出队条件
        return olddata;
    }
    @SuppressWarnings("unchecked")
    public T peek()
    {
        if(isEmpty())
            throw new RuntimeException("队列已空,无法查看队首元素!");
        return (T) data[front];
    }
    public boolean isFull()
    {
        return (rear+1)%maxSize == front;//队满条件
    }
    public boolean isEmpty()
    {
        return front==rear;//队空条件
    }
}

五,测试

public class TestArrayQueue {
    public static void main(String[] args) {
        ArrayQueue<String> queue = new ArrayQueue<String>(5);
        queue.addFront("泰山");
        queue.addFront("华山");
        queue.addFront("衡山");
        queue.addFront("恒山");
        queue.addFront("嵩山");
        //queue.addFront("黄果树瀑布");
        while(!queue.isEmpty())
        {
            System.out.println(queue.remove());
        }
        System.out.println(queue.peek());
    }
}

运行结果:

泰山
华山
衡山
恒山
嵩山
Exception in thread "main" java.lang.RuntimeException: 队列已空,无法查看队首元素!

使用数组的方式也很好的实现了队列的基本功能,但是存在一个问题,就是我们必须事先知道队列的大小,跟数组一样无法动态扩展队列的容量,因此最佳的实现队列的办法还是采用前面实现的顺序表或者链表来实现。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YIXIANG0234/article/details/79952572

数据结构基础系列(2):线性表

-
  • 1970年01月01日 08:00

java之实现 线性表、栈和队列

线性表是存储顺序牌类的数据时最常用的数据结构。     实现线性表有两种方式。第一种是使用数组存储线性表的元素。数组是动态创建的。超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素...
  • crazy1235
  • crazy1235
  • 2013-02-04 14:48:04
  • 3799

线性表、堆栈、队列的特点,及代码实现

一、线性表:  线性表定义:线性表是n个数据元素的有限序列 线性表有多种实现方式,线性、链式等,其中线性实现采用随机存储的方式: 二、堆栈: 定义:栈是限定仅在表尾进行插入或者删除操作的线性表。 特点...
  • tiandixuanwuliang
  • tiandixuanwuliang
  • 2017-04-08 21:16:04
  • 13812

线性表,栈,队列操作实现

  • 2015年11月29日 01:18
  • 485KB
  • 下载

线性表、链表、栈、队列的关系

程序员在编程实战操作面前有两个拦路虎,第一个是用递归的思想去解决问题,第二个是数据结构与算法的应用。对于递归,由于其神奇的薄面纱总是然我们觉得难以理解,而大多数递归解法还是需要承担一定的计算负担的,因...
  • qq_26849233
  • qq_26849233
  • 2017-05-16 09:14:31
  • 1142

数组、链表、堆栈和队列、线性表和顺序表

转自http://blog.csdn.net/amork/article/details/7258216 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:...
  • qingkongyeyue
  • qingkongyeyue
  • 2016-12-26 13:51:06
  • 1629

多态实现线性表(队列,串,堆栈),要求具备线性表的基本操作

代码如下: #include using namespace std; template struct tcontainer { virtual void push(const t&) = 0;...
  • Senlinhust
  • Senlinhust
  • 2016-07-27 14:03:20
  • 391

线性表之--链表、栈、队列

前言:基本的数据结构分类            其中,Hash属于散列存储结构。顺序表在内存中是连续的存储空间;而链式在内存中是逻辑上连续,但空间上可以不连续的。今天来介绍一下线性...
  • fightfaith
  • fightfaith
  • 2016-02-05 18:31:41
  • 1087

线性表、栈、队列的的顺序储存和链式储存

先概括一下顺序储存和链式储存。 线性表的顺序储存是用一组地址连续的储存单元依次存储线性表的数据元素。 线性表的链式储存是用指针将储存线性表中的数据元素的那些单元依次串联在一起。 接下来图片说明。 ...
  • qq235asd123
  • qq235asd123
  • 2015-03-09 16:39:31
  • 784

数据结构之线性表、栈、队列

线性表 一、定义 线性表是n个数据元素的有限序列。 二、线性表的顺序表示和实现 即用一组地址连续的储存单元依次存储线性表的数据元素。以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间...
  • ljianhui
  • ljianhui
  • 2012-08-07 20:13:26
  • 7051
收藏助手
不良信息举报
您举报文章:线性表——队列(java实现)
举报原因:
原因补充:

(最多只允许输入30个字)