数据结构4--队列(java代码实现队列的链式存储)

1.什么是队列?

     队列也叫队,时允许在一段进行擦汗如另一端进行删除的运算受限的线性表。区别队列和栈:栈时先进后出,队列时先进先出。

                                           

2.顺序队列

    队列的顺序储存结构称为顺序队列,可以做到不浪费地址空间

    顺序队列使用front和rear两个指针分别指向队头元素和队尾元素的位置

   入队出队的演示:

                                                        

 顺序队列的特点:

  1.  静态分配储存空间
  2. 入队操作只能在队尾,出队操作只能在队首
  3. 队列为空时front=rear
  4. 队列为满时,rear=队列的长度-1
  5. 队列非空非满时 front<rear<队列的长度-1

     

     选A

 3.链式队列(重点)

    队列的链式存储结构称为链式队列

                                                    

    链式队列的特点:

  1.     动态分配存储空间
  2. 入队操作在队尾进行,出队操作在队头进行
  3. 链式队列在入队时无队满的问题
  4. 链式队列为空队列的条件:front=rear

  4.java代码实现链式队列

       底层使用WxLinkList实现,WxLinkList是由我自己实现的一个线性表的链式储存,队列也是在线性表的链式存储的基础上来的,但是这里我修复了一个线性表的链式存储的删除元素的bug,之前没有考虑到删除头节点的问题,所以我把修改后的删除方法贴出来

      

/*
      指定删除一个元素
     */
    @Override
    public void remove(T elementm) {
        Node node=new Node(elementm,null);
        //历遍,判断是否相等
        Node current=header;
        Node prenode=null;  //要删除节点的上一个
        for (int i=0;i<size&&current!=null;i++,prenode=current,current=current.next)
        {
            if (node.getNodevalue().equals(current.getNodevalue()))
            {
                //如果删除的时头节点,prenode会为null;所以在这里需要判断,队列在这里透视需要弹出top的元素
                //当队列中只有一个元素的时候current.next;会为null
                if(i==0&&size>1)
                {
                    //当前节点的下一个节点为头节点
                    Node next = current.next;
                    header=next;
                    size--;
                }
                else if (i==0&&size==1)
                {
                    clear();
                }
                else {
                    Node nextnode=current.next;  //要删除节点的下一个节点
                    prenode.next=nextnode;       //当前节点的指针域指向下一个节点就删除了当前的节点
                    size--;
                }
            }
        }
    }

  接下来回到队列上来,老规矩,首先实现队列的基本操作接口:

package com.wx.datastructure.base;

public interface WxQueue {
    /*
      链式队列的接口
     */
    public boolean isEmpty();//判断队列是否为空
    public int size();       //返回队列的大小
    public void push(Object element); //将元素由队尾压入队列
    public Object pop();     //弹出队首的元素
    public Object peek();    //查找队首的元素
}

 然后实现接口的方法:
 

package com.wx.datastructure.imp;

import com.wx.datastructure.base.WxQueue;

import java.util.NoSuchElementException;

public class WxQueueImp implements WxQueue {
    /*
      实现队列的接口方法
     */
    private WxLinkList linkList=null;
    public WxQueueImp()
    {
        linkList=new WxLinkList();
    }

    /*
      判断队列是否为空
     */
    @Override
    public boolean isEmpty() {
        return linkList.isEmpty();
    }
    /*
      返回队列的大小
     */
    @Override
    public int size() {
        return linkList.size();
    }

    /*
      从队尾压入元素
     */
    @Override
    public void push(Object element) {
        linkList.addLast(element);
    }

    /*
        弹出队首元素
     */
    @Override
    public Object pop() {
        if (linkList.isEmpty())
        {
            throw new NoSuchElementException("队列为空");
        }
        Object o = linkList.get(0);
        linkList.remove(o);
        return o;
    }

    @Override
    public Object peek() {
        if (linkList.isEmpty())
        {
            throw new NoSuchElementException("队列为空");
        }
        return linkList.get(0);
    }
}

 测试:
 

package com.wx.datastructure.test;

import com.wx.datastructure.base.WxQueue;
import com.wx.datastructure.imp.WxQueueImp;

import java.util.Scanner;

public class TestWxQueue {
    /*
    测试WxQueue
     */
    public static void main (String[] args)
    {
        WxQueue wxQueue=new WxQueueImp();
        Scanner input =new Scanner(System.in);
        System.out.print("输入压入队列的元素,输入quit表示离开:");
        String element=input.next();
        while (!element.equals("quit"))
        {
            wxQueue.push(element);
            element=input.next();
        }
        while (!wxQueue.isEmpty())
        {
            System.out.print("    ");
            System.out.print(wxQueue.pop());
        }
    }
}

  测试的结果,果然是先进先出的序列:

 

至于队列的线性存储的实现,底层可以选用我写的线性表的顺序存储然后参照本篇博客来实现

不说了,本篇博客代码地址:https://github.com/WangAlainDelon/DataStructure4.git

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/84060615