栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一道题学会栈、队列两种数据结构

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一道题学会栈、队列两种数据结构

来看这样一道题!

 解题思路:

(1)队列

package com.Parking;
//队列结构
import java.util.Iterator;

public class Queue implements Iterable{
    //记录首结点
    private Node head;
    //记录最后一个结点
    private Node last;
    //记录队列中元素的个数
    private int N;

    private class Node{
        public T item;
        public Node next;

        public Node(T item, Node next) {
            this.item = item;
            this.next = next;
        }
    }
    public Queue() {
        this.head = new Node(null,null);
        this.last=null;
        this.N=0;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return N==0;
    }
    //返回队列中元素的个数
    public int size(){
        return N;
    }

    //向队列中插入元素t
    public void enqueue(T t){
        if (last==null){
            //当前尾结点last为null
            last= new Node(t,null);
            head.next=last;
        }else {
            //当前尾结点last不为null
            Node oldLast = last;
            last = new Node(t, null);
            oldLast.next=last;
        }
        //元素个数+1
        N++;
    }

    //从队列中拿出一个元素
    public T dequeue(){
        if (isEmpty()){
            return null;
        }
        Node oldFirst= head.next;
        head.next=oldFirst.next;
        N--;
        //因为出队列其实是在删除元素,因此如果队列中的元素被删除完了,需要重置last=null;
        if (isEmpty()){
            last=null;
        }
        return oldFirst.item;
    }

    @Override
    public Iterator iterator() {
        return new QIterator();
    }

    private class QIterator implements Iterator{
        private Node n;
        public QIterator(){
            this.n=head;
        }
        @Override
        public boolean hasNext() {
            return n.next!=null;
        }
        @Override
        public Object next() {
            n = n.next;
            return n.item;
        }
    }
}

(2)栈 

package com.Parking;
import java.util.Iterator;
public class Stack implements Iterable{
    //存储元素的数组
    private T[] eles;
    //记录当前栈中的元素个数
    private int N;
    //构造方法
    public Stack(int capacity){
        //初始化数组
        this.eles=(T[])new Object[capacity];
        //初始化长度
        this.N=0;
    }

    //将一个栈置为空
    public void clear(){
        this.N=0;
    }

    //判断当前栈是否为空
    public boolean isEmpty(){
        return N==0;
    }

    //获取栈的元素个数
    public int size(){
        return N;
    }

    //获取指定位置的元素
    public T get(int i){
        return eles[i];
    }

    //判断当前栈是否已满
    public boolean isFull(){
        return N == eles.length;
    }

    //把t元素压入栈
    public void push(T t){
        if(N == eles.length){
            System.out.println("栈已满");
        }
        else
            eles[N++]=t;
    }

    //弹出栈顶元素
    public T pop(){
        //记录索引i处的值
        T current = eles[N-1];
        //元素个数-1
        N--;
        return current;
    }

    //遍历栈
    @Override
    public Iterator iterator() {
        return new SIterator();
    }

    private class SIterator implements Iterator{
        private int cusor;
        public SIterator(){
            this.cusor = 0;
        }
        @Override
        public boolean hasNext() {//判断容器还有没有下一个元素
            return cusor < N;
        }

        @Override
        public Object next() {//获取当前容器下一个元素
            return eles[cusor++];
        }
    }
}

(3)封装一个Car类,存储车辆到达/离去的标识,汽车牌照号,以及到达/离去的时刻 

package com.Parking;

public class Car {
    private String AD;
    private int nob;
    private int time;

    public Car(String AD, int nob, int time) {
        this.AD = AD;
        this.nob = nob;
        this.time = time;
    }

    public String getAD() {
        return AD;
    }

    public void setAD(String AD) {
        this.AD = AD;
    }

    public int getNob() {
        return nob;
    }

    public void setNob(int nob) {
        this.nob = nob;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }
}

(4)主程序

package com.Parking;
import java.util.Iterator;
import java.util.Scanner;

public class Car_Park {
    public static void main(String[] args) {
        Stack stack1 = new Stack<>(4); //栈1用于充当停车场,已指定容量为4
        Stack stack2 = new Stack<>(3);//栈2用于保存出栈的元素顺序
        Queue queue = new Queue<>();//队列用于存储排队的车辆
        //为车库初始化,存放三辆车
        Car array[] = {new Car("A",1001,1),new Car("A",1002,2),new Car("A",1003,3)};
        //遍历二维数组存放车辆,初始化停车场
        int stack1num = 1;
        int queuenum = 1;
        for (int i = 0; i < 3; i++) {
            stack1.push(array[i]);  //栈未满进行压栈操作
            System.out.println(array[i].getNob() + "号车已停在第" + stack1num + "号停车位,停车时刻为"+array[i].getTime()+"时刻");
            stack1num++;
        }
        System.out.println("停车场已为你初始化完毕!欢迎进入车库管理系统");
        System.out.println("请输入操作对应的编号:");
        System.out.println("-----1-----停车或从车库中开出一辆车");
        System.out.println("-----2-----从候车便道开出一辆车");
        System.out.println("-----3-----查看候车场车辆信息");
        System.out.println("-----4-----退出车库管理系统");
        while (true) {
            Scanner s = new Scanner(System.in);
            int temp = 0;
            temp = s.nextInt();
            switch (temp) {
                case 1: // -----功能1-----停车或从车库中开出一辆车
                    System.out.println("请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)");
                    String AD=s.next();
                    int nob=s.nextInt();
                    int time=s.nextInt();
                    Car car=new Car(AD,nob,time);
                    switch (car.getAD()) {
                        case "A":
                            if (!stack1.isFull()) {
                                stack1.push(car);   //栈未满进行压栈操作
                                System.out.println(car.getNob() + "号车已停在第" + (stack1num++) + "号停车位,停车时刻为"+car.getTime()+"时刻");
                                stack1num++;
                            }else {              //栈已满将元素放入队列中排队
                                car.setTime(0);
                                queue.enqueue(car);
                                System.out.println("车库已停满!!!已将车辆停放时刻置为0,你已进入候车位");
                                System.out.println(car.getNob() + "号车正在第" + queuenum + "号候车位等候");
                                queuenum++;
                            }
                            break;
                        case "D":
                            // car.getNob()是汽车出栈的编号,现用栈里的编号与出栈编号比较 相同则出栈不相同则保存到栈2里
                            Car chuzhan = null; //记录弹出栈的元素
                            int firstTime = 0; //记录初始时间
                            int lastTime = car.getTime(); //记录结束时间
                            int tim = 0;  //记录时间差
                            while (!stack1.isEmpty()) {        //提取全部元素,符合要求的直接提取,不符合存入栈2
                                Car temp1 = stack1.pop();
                                if (!(temp1.getNob()==car.getNob())) {
                                    stack2.push(temp1);
                                } else {  //符合要求提取出来
                                     chuzhan = temp1;             //将弹出元素赋值变量chuzhan
                                    tim=car.getTime()-chuzhan.getTime();
                                    System.out.println(""+chuzhan.getNob()+"号车辆已出车库,你的车辆停放时长为"+tim+"时,请缴纳相关费用!");
                                }
                            }
                            //弹栈后,栈2和队列里面的元素进栈,栈2全进,队列进1
                            stack1num = 1;//车位重置
                            System.out.println("车库车位已重置!");
                            while (!stack2.isEmpty()) {
                                Car temp2 = stack2.pop();
                                stack1.push(temp2);
                                System.out.println(temp2.getNob() + "号车已停在第" + stack1num+ "号停车位");
                                stack1num++;
                            }
                            if(!queue.isEmpty()) {
                                Car temp3 = queue.dequeue();
                                queuenum--;
                                int ti=car.getTime();
                                temp3.setTime(ti);
                                stack1.push(temp3);
                                System.out.println(temp3.getNob() + "号车已停在第" + stack1num + "号停车位,停车时刻为"+ temp3.getTime()+"时刻");
                                stack1num++;
                            }
                            break;
                    }
                    break;
                case 2: // -----功能2-----从候车便道开出一辆车
                    System.out.println("请输入你要开出候车位的车辆的编号!");
                    int nobb=s.nextInt();
                    Queue queueTemp = new Queue<>();
                    while (!queue.isEmpty()){
                        Car car1=queue.dequeue();
                        if(!(car1.getNob()==nobb)) {
                            queueTemp.enqueue(car1);
                        }
                    }
                    queuenum--;
                    while (!queueTemp.isEmpty()) {
                        Car car2 = queueTemp.dequeue();
                        queue.enqueue(car2);
                    }
                    System.out.println("车辆已成功从候车位开出!本次停留不收取任何费用");
                    break;
                case 3:  // -----功能3-----查看候车场车辆信息
                    int queuem=1;
                    Iterator it=queue.iterator();
                    if(queue.isEmpty()){
                        System.out.println("候车位为空!");
                    }else {
                       while (it.hasNext()){
                        Object obj=it.next();
                        Car car1=(Car) obj;
                        System.out.println(car1.getNob() + "号车正在第" + queuem + "号候车位等候");
                        queuem++;
                        }
                    }
                    break;
                case 4: //-----4-----退出车库管理系统
                    System.out.println("成功退出车库管理系统,欢迎再次进入!!!");
                    return;
            }
        }
    }
}


(5)运行结果 

1001号车已停在第1号停车位,停车时刻为1时刻
1002号车已停在第2号停车位,停车时刻为2时刻
1003号车已停在第3号停车位,停车时刻为3时刻
停车场已为你初始化完毕!欢迎进入车库管理系统
请输入操作对应的编号:
-----1-----停车或从车库中开出一辆车
-----2-----从候车便道开出一辆车
-----3-----查看候车场车辆信息
-----4-----退出车库管理系统
1
请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)
A
1004
4
1004号车已停在第4号停车位,停车时刻为4时刻
1
请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)
A
1005
5
车库已停满!!!已将车辆停放时刻置为0,你已进入候车位
1005号车正在第1号候车位等候
1
请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)
D
1002
6
1002号车辆已出车库,你的车辆停放时长为4时,请缴纳相关费用!
车库车位已重置!
1001号车已停在第1号停车位
1003号车已停在第2号停车位
1004号车已停在第3号停车位
1005号车已停在第4号停车位,停车时刻为6时刻

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/301059.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号