28-咸鱼学Java-Java中的链式队列

简介

链式队列也符合队列的基本模式,及先进先出,后进后出的原则,只是实现方式发生了改变,其图解为
这里写图片描述
红色的为引用,黑色的为节点
其具体实现方式见代码。

代码

/**
 * 链式队列
 * @author 焦焱
 *
 */
public class LinkQueue {
    /**
     * 队头
     */
    private Entry front = null;
    /**
     * 队尾
     */
    private Entry rear = null;
    /**
     * 队的长度
     */
    private int size = 0;
    /**
     * 节点类
     * @author 14831
     *
     */
    class Entry
    {
        /**
         * 节点的数据域
         */
        int data;
        /**
         * 节点的指针域
         */
        Entry next;
        /**
         * 有参构造
         * @param val
         */
        public Entry(int val) {
            this.data = val;
            this.next = null;
        }
        /**
         * 无参默认构造
         */
        public Entry() {
            this(-1);
        }
    }

    /**
     * 入队
     * @param val 数据
     */
    public void Push(int val)
    {   //如果队为空
        if(isEmpty())
        {
        //如果为空的时候,没有第一个节点
        //所以要先创建第一个节点
        //new一个节点,然后rear和front都指向他
        rear = new Entry(val);
        front = rear;
        }
        else{
        //当不为空的时候,有第一个节点
        //入队的时候要入到队列的最后面及rear.next的位置
        Entry entry = new Entry(val);
        rear.next = entry;
        //rear队尾要指向新的队尾
        rear = entry;
        }
        size++;
    }

    /**
     * 出队
     * @return 数据
     */
    public int pop()
    {   //如果栈为空的时候直接返回-1
        if(isEmpty()){
            return -1;
        }
        //先获取数据
        int val = front.data;
        //队头向后移动,删去第一个元素,及出队
        front = front.next;
        //队的长度减1
        size--;
        return val;
    }
    /**
     * 判断是否为空
     * @return 是否为空
     */
    public boolean isEmpty()
    {
        return size==0;
    }
    /**
     * 得到队头
     * @return
     */
    public int getTop()
    {   //如果为空返回-1
        if(isEmpty()){
            return -1;
        }
        //不为空返回队头的元素的数据
        return front.data;
    }
    /**
     * 输出当前队列的所有元素
     */
    public void show()
    {   //如果队列为空,什么都不执行
        if(isEmpty()){
            return;
        }
        //如果不为空,进行遍历,其方法和遍历单链表相同
        Entry cur = front;
        while(cur!=null)
        {
            System.out.print(cur.data+" ");
            cur = cur.next;
        }
        System.out.println();
    }
    /**
     * 将当前队列序列化为一个数组
     * @return 当前队列的数组
     */
    public int[] toArray()
    {   //如果为队列空则返回null
        if(isEmpty()){
            return null;
        }
        //不为空的话进行遍历赋值
        //将数据都存入新new的数组
        Entry cur = front;
        int[] a = new int[size];
        int i = 0;
        while(cur!=null)
        {
            a[i++] = cur.data;
            cur = cur.next;
        }
        return a;
    }
    /**
     * 获取当前队列长度
     * @return
     */
    public int getSize() {
        return size;
    }
}

测试

    public static void main(String[] args) {
        LinkQueue t = new LinkQueue();
        for (int i = 0; i < 10; i++) {
            t.Push(i);
        }
        t.show();
        for (int i = 0; i < 11; i++) {
            System.out.print(t.pop()+" ");
        }

    }

结果
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 -1

最后一个-1为过度出队返回的-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值