使用数组制作一个队列取票器(Java)

以下代码实现都是基于的超级数组进行实现的。

超级数组的相关代码在最后面,如果对数组特别了解的小伙伴可以忽略不看。

下面进入正题:

首先引入取票器代码:

public class BankTicket {
    //设置一个变量对队列进行填充
    private int startNumber = 100;
    //设置公用的Scanner方法
    private Scanner scanner = new Scanner(System.in);
    //实例化队列
    private Queue queue = new Queue();


    //程序入口
    public void inputName(){
        //先对队列进行填充
        for (int i = 1;i< startNumber;i++) queue.add(i);
        //循环执行
        while (true){
            System.out.println("请你输入您的名字:");
           String name= scanner.next();
           //进到取票方法
           Integer ticket = getTicket();
            System.out.println("尊敬的[" +name+ "],您的号码是:"+ ticket +".");
        }
    }
    //取票方法
    private Integer getTicket(){
        //首先进行判空
        if(queue.isEmpty()){
            System.out.println("号码已经全部取完了,需要继续释放号码!");
            System.out.println("请输入号码的个数:");
            Integer number = scanner.nextInt();
            pushTicket(number);
        }
        return queue.pop();
    }
    //增加队列的容量
    public void pushTicket(int ticketNumber){
        for (int i = 0; i < ticketNumber; i++) {
            startNumber ++;
            queue.add(startNumber);
        }
    }
}

运用oop思想对以上代码进行封装。想要执行它可以直接在这个class中创建main方法,或者新建

一个方法类代码如下:

public class Client {
    public static void main(String[] args) {
        BankTicket bankTicket = new BankTicket();
          bankTicket.inputName();

    }
}

 取票器中使用到的队列代码。

public class Queue {
    SuperArray superArray = new SuperArray();

    //入队
    public void add(int data){
        superArray.addToTail(data);
    }
    //出队
    public int pop(){
        Integer select = superArray.select(0);
        superArray.delete( 0);
        return select;
    }

    //判空
    public boolean isEmpty(){
        return superArray.size() == 0;

    }

    //返回队头
    public int peek(){
        return superArray.select(0);

    }
}

最后是取票器的核心部分:

超级数组的实现

/*
超级数组
 */
public class SuperArray {
    //搞一个能存放data的数组
    private int[] element;

    //下标,维护当前存储的位置,数组里面的位置下标
    private int currentIndex = -1;

    //    index也是下标,用于查找当前数组位置的下标,与currentIndex的
    //作用不同,currentIndex是指向当前数组最后一个位置
    //Index是随机找到当前的下标对应的data---element[Index]
    //    data 为数据


    //使用构造器初始化
    public SuperArray(){
        this(10);

    }
    //重载构造器
    public SuperArray(int capacity){
        element = new int[capacity];

    }

    //对数据的增删改查
    //增加一个元素,尾插
    public void add(int index,int data){
        //游标向前走
        currentIndex ++;
        //如果超出数组的边界就进行扩容
        if(currentIndex > element.length - 2){
            int [] temp = new  int[element.length*2];
            for (int i= 0; i <element.length ; i++) {
                temp[i] = element[i];
            }
            element = temp;
        }
        //移动位置,腾出空间
        for (int i = currentIndex; i >= index; i--) {
            element[i+1] = element[i];
        }
        element[index] = data;

    }
    //尾插性能对比  10w数据  头插 1286ms 尾插 3ms
    //头插需要挪动整个数组,数据过多时每次空间复杂度为O(n),时间复杂度为O(1)
    //而尾插则不需要挪动位置,空间复杂度O(1),根据下标可以直接找到对应位置,时间复杂度也为O(1)


    //头插
    public void addToHeader(int data) {
        this.add(0, data);
    }
    //尾插
    public void addToTail(int data) {
        this.add(currentIndex + 1, data);
    }

    //删除一个元素
    public void delete(int index){
        //边界判断
        if(index < 0 || index >element.length - 1){
            System.out.println("您删除的下标"+index+"不在范围之内!");
        }else {
            for (int i = index + 1; i <element.length ; i++) {
                element[i - 1] = element[i];
            }
            currentIndex --;

        }

    }
    //修改一个元素
    public void set(int index,int data){
        //越界判断
        if(index < 0 || index >element.length-1){
            System.out.println("您修改的下标"+index+"不在范围之内!");
        }else {
            element[index] = data;
        }


    }
    //查询下标为data的元素
    public Integer select(int index) {
        if (index < 0 || index > element.length - 1) {
            System.out.println("您查找的下标" + index + "不在范围之内!");
            return null;
        } else {
            return element[index];
        }
    }
    //获取数组长度
    public int size(){
        return currentIndex+1;

    }
    //把数组变成字符串,tostring方法
    public String arrayToString(){
        String result = "[";
        for (int i = 0; i <= currentIndex; i++) {
            result += element[i]+",";
        }

        return  result.substring(0,result.length()-1) + "]";

    }
    //手撸的冒泡排序,学个方法,论效果真不如 .sort()
    public void sort(){
        for (int i = 0; i < currentIndex; i++) {
            for (int j = 0; j < currentIndex - i; j++) {
                if(element[j] > element[j+1]){
                    int temp = element[j];
                    element[j] = element[j+1];
                    element[j+1] = temp;
                }
            }
        }

    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值