队列实现及其操作java版

队列实现及其操作java版

静态队列–循环队列

未完成,出现无法出队及最后一个元素无法显示的bug

package 数据结构.队列;

/*
    静态队列通常都是循环队列——数组前面删掉的多了,闲置空间就无法利用在队列中,使得队列空间越用越少
    1.什么是循环队列——数组中两个指针内区间域作为队列域,循环的是指针,
    2.循环队列结构——有限数组,头指针(int),尾指针(int)
    3.头尾指针不同场景下的含义:
        (1)初始化:front=rear=0
        (2)队列非空:front指向队列第一个元素;rear指向队列最后一个有效元素的下一个元素
        (3)队列为空:front=rear,但不一定为0,因为是循环队列,数组中两个指针内区间域作为队列域
    4.入队操作
        (1)将值插入到rear所在位置
        (2)rear=(rear+1)%数组的长度——取余操作,使队列尾指针可以循环(一直在队列内)
    5.出队操作
        (1)front=(front+1)%数组的长度——取余操作,使队列头指针可以循环(一直在队列内),出队节点的元素不用管,后面会自动覆盖赋值
    6.判断是否为空
        (1)front==rear,则队列一定为空
    7.判断是否为满
        前置知识:front可能比rear大,也可能小,也可能相等——因为指针循环
        判断方法:两种方式
        (1)增加一个queue_len变量,监控队列空间
        (2)如果r和f的值紧挨着,则队列已满
           判断条件:(r+1)%数组长度==f,则满
    //未完成,出现无法出队及最后一个元素无法显示的bug
 */

class Queue_arr {
    private int[] arr;  //构造队列体
    private int front;  //构造头指针——指向队列第一个数
    private int rear;  //构造尾指针——指向队列最后一个数

    Queue_arr(int queue_max) {
        this.arr = new int[queue_max];
        this.front = 0;//初始化,头指针指向数组第一个空间
        this.rear = 0;//初始化,尾指针指向数组第一个空间
    }

    //入队
    void In_queue(int x) {
        //先判断队列是否已满
        if (front != (rear + 1) % arr.length) {
            arr[rear] = x;
            rear = (rear + 1) % arr.length;
        } else {
            System.out.println("队列已满");
        }
    }

    //出队
    int Out_queue() {
        //先判断队列是否不为空
        if (front == rear) {
            int res = arr[front];
            front = (front + 1) % arr.length;
            return res;
        } else {
            System.out.println("队列为空");
            return -1;
        }
    }

    //打印
    void print_queue() {
        //三种情况:front<rear——未出现循环,front==rear——队列为空,front>rear——出现循环
        //1.front<rear——依次打印出队列值
        if (front < rear) {
            System.out.print("队列数据为:");
            for (int i = front; i < rear; i++) {//注意端点取值
                System.out.print(arr[i]);
                System.out.print(' ');
            }
            System.out.println();
        //2.front==rear——为空?
        } else if (front == rear) {
            System.out.println("队列为空");
        //3.front > rear——有循环,分开遍历
        } else if (front > rear) {
            //先遍历front到末端的值
            System.out.print("队列数据为:");
            for (int i = front; i < arr.length; i++) {//注意端点取值
                System.out.print(arr[i]);
                System.out.print(' ');
            }
            //在遍历rear到front(不含)的值
            for (int i = rear; i < front; i++) {//注意端点取值
                System.out.print(arr[i]);
                System.out.print(' ');
            }
            System.out.println();
        }

    }

}

public class 静态队列 {
    public static void main(String[] args) {
        Queue_arr A = new Queue_arr(3);
        A.In_queue(10);
        A.In_queue(50);
        A.In_queue(30);
        A.print_queue();
        A.In_queue(10);
        int x = A.Out_queue();
        System.out.println(x);
    }
}

链式队列

已实现队列功能

package 数据结构.队列;

/*
    思路:实现先进先出,函数:入队、出队
         从尾部入队,从头部出队
         节点设置:单链表节点
         节点外指针:头指针-front,尾指针-rear
         出队:头指针下移,返回首节点
         入队:尾指针下移,指向新节点
 */


//构造节点
class link {
    int content;
    link next;

    //构造器
    link(int content) {
        this.content = content;
        this.next = null;//这句可以不用写,没有赋值时next本身就是null
    }
}

class Queue{
    //指针设置
    link front;//头指针
    link rear;//尾指针

    //初始化,无需头结点-头指针代替头结点功能,不过要在队列为空入队时要先将头指针尾指针先指向新节点
    Queue(){
        front = null;
        rear = null;
    }

    //入队-修改尾节点,修改尾指针
    void In_Queue(int x){
        //创建新节点
        link new_link = new link(x);

        //判断是否为空队列,是则将头指针尾指针先指向新节点
        if (front == null) {
            front = new_link;
            rear = new_link;
        }else {
            //修改尾节点
            rear.next = new_link;
            //修改尾指针
            rear = new_link;
        }


    }

    //出队-头指针下移,返回首节点
    int Out_Queue(){
        //先判断有无节点
        if (front != null) {
            //缓存首节点内容
            int l = front.content;
            //头指针下移
            front = front.next;
            //返回首节点内容
            return l;
        }else {
            System.out.println("队列为空");
            return -1;
        }

    }
    //显示
    void print_Queue(){
        //定义遍历指针
        link team = front;
        //循环取数据打印,当遍历指针为空时结束循环
        System.out.print("队列中数据为:");
        while (team!=null){
            System.out.print(team.content);
            System.out.print(" ");
            team = team.next;
        }
        System.out.println();
        return;
    }
}

public class 链式队列 {
    public static void main(String[] args) {
        //新建队列
        Queue queue = new Queue();
        //入队
        queue.In_Queue(10);
        //显示
        queue.print_Queue();
        //入队
        queue.In_Queue(20);
        //显示
        queue.print_Queue();
        //出队
        int i = queue.Out_Queue();
        System.out.println(i);
        queue.print_Queue();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值