队列(尚硅谷_韩老师_自学笔记)

 

一、队列的含义及特点

  • 含义:队列是一个数据呈线性排列的数据结构,可以用数组和链表来实现。
  • 特点:先进先出,队列中添加和删除数据的操作分别是在两端进行的。

二、图解

三、用数组模拟单链队列

 一)、思路

1、确定队列的长度(maxSize)

2、确定队列的首尾(front、rear)

  • front 指向队列首,随数据的取出而改变,初始值为-1,代表队列首的前一个位置
  • rear:指向队列尾,随数据的添加而改变,初始值为-1,代表队列尾的当前位置

3、确定队列的功能

①添加数据(addQueue)

    a、判断是否满(isFull)

  • rear == maxsize-1

    b、每添加一个数据,rear+1  注意:要先加一再取数据

②取出数据(getQueue)

  a、判断是否为空(isEmpty)

  •   rear == front
  • 可以通过throw new RuntimeException();抛出异常来阻止数据的取出
    

  b、取出数据,front+1,注意:要先加一再取数据

③查看队列(showQueue)

  a、若为空,打印队列为空

  b、否则,按照遍历数组的方式查看队列

④查看队列首的数据(headQueue)

同③,注意:front指的是队列首的前一个位置,所以在查看的时候索引值应该为front+1

4、代码实现

package Queue;

import java.util.Scanner;

public class ArrayLineQueue {
    public static void main(String[] args) {
        ArrQuene arrQuene = new ArrQuene(3);
        fun();
        char key = ' ';
        boolean run = true;
        while (run) {
            key = new Scanner(System.in).next().charAt(0);
            switch (key) {
                case 's':
                    arrQuene.showQueue();
                    break;
                case 'a':
                    arrQuene.addQueue();
                    break;
                case 'g':
                    try{
                        int res = arrQuene.getQueue();
                        System.out.println("取出的数据为:" + res);
                    }catch (Exception e){
                        //TODO:handle exception
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try{
                        int res = arrQuene.headQueue();
                        System.out.println("队列头为:" + res);
                    }catch (Exception e){
                        //TODO:handle exception
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    System.out.println("程序结束");
                    run = false;
                    break;
                default:
                    break;
            }
        }
    }

    public static void fun() {
        System.out.println("===查看队列(s)===");
        System.out.println("===添加数据(a)===");
        System.out.println("===取出数据(g)===");
        System.out.println("===查看队列首(h)===");
        System.out.println("===退出程序(e)===");
    }
}


class ArrQuene {
    private int maxsize;
    private int rear;
    private int front;
    private int[] arr;

    //队列构造器
    public ArrQuene(int maxsize) {
        this.maxsize = maxsize;
        arr = new int[maxsize];
        rear = -1;
        front = -1;
    }

    public boolean isFull() {
        return rear == maxsize - 1;
    }

    public boolean isEmpty() {
        return rear == front;
    }

    public void addQueue() {
        if (isFull()) {
            System.out.println("队列满不可加");
            return;
        }
        System.out.print("请输入一个数据:");
        int addnum = new Scanner(System.in).nextInt();
        rear++;
        arr[rear] = addnum;
    }

    public int getQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列空,不能取数据");
        }
        return arr[++front];
    }

    public void showQueue() {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    public int headQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列空,无数据");
        }
        return arr[front + 1];
    }
}

5、分析问题

①在循环和switch之间处理不得当,导致死循环。

问题代码

改正代码

 

②异常处理不到位

6、运行结果

由此可见:

  • 数组模拟的链表的取数据并不是真正的把数组里面的数据取出恢复为空
  • 且指针rear和front走完一遍便不会回到队首
  • 导致该链表只能一次性使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值