首页 > 其他分享 >队列(最基本队列,标准队列 2个,双端队列,单调队列)

队列(最基本队列,标准队列 2个,双端队列,单调队列)

时间:2023-11-26 22:34:25浏览次数:38  
标签:队列 双端 System int tail max front 单调 out

2023-11-26

最基本队列:一次性使用的

class Queue01{
    //最基本队列,一次性的,数组模拟,先进先出
    //功能:入队,出队,判满,判空,显示队头,显示队列
    private int[] queue;
    private int front=-1;//指向第一个元素前一个位置
    private int tail=-1;//指向最后一个元素
    private int max;
    public Queue01(int max){//构造方法创建队列
        this.max=max;
        queue=new int[this.max];
    }
 
    //判满
    public boolean isFull(){
        return tail==this.max-1;//其实真正的满,不是这个条件,应该与front有关
    }
    //判空
    public boolean isEmpty(){
        return tail==front;
    }
    //入队
    public void pushQueue(int i){
        if(isFull()){
            System.out.println("队列已满。无法入队");
            return;
        }
        tail++;
        queue[tail]=i;
        System.out.println("入队成功");
    }
    //出队
    public int popQueue(){
        if(isEmpty()){
            System.out.println("队列为空,无法出队");
            return -999999;
        }
        front++;
        return queue[front];
    }
 
    //显示队头
    public void showHead(){
        if(isEmpty()){
            System.out.println("队列为空");
            return ;
        }
        System.out.println(queue[front+1]);
    }
 
    //显示队列
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列为空");
            return ;
        }
        for(int i=front+1;i<=tail;i++){
            System.out.print(queue[i]+"\t");
        }
        System.out.println();
        return;
    }
 
}

标准队列:front与tail为-1开始的,难写一点

class Queue02{
    //先进先出,数组模拟环形队列
    //功能:入队,出队,判满,判空,显示队头,显示队列
    //front=tail=-1 后面的代码难写点
    private int max;
    private int front=-1;
    private int tail=-1;
    private int[] queue;
    public Queue02(int max){
        this.max=max+1;
        queue=new int[this.max];
    }
 
    //判空
    public boolean isEmpty(){
        return front==tail;
    }
    //判满
    public boolean isFull(){
        return (tail-front+1+max)%max==0;  //-1   4(不是5,要空出来一个位置防止冲突)
    }
    //入队
    public void pushQueue(int i){
        if(isFull()){
            System.out.println("队列满,无法入队");
            return;
        }
        tail=(tail+1)%max;
        queue[tail]=i;
        System.out.println("入队成功");
    }
    //出队
    public int popQueue(){
        if(isEmpty()){
            System.out.println("队列空,无法出队");
            return -9999;
        }
        front=(front+1)%max;
        return queue[front];
    }
    //显示队头
    public void showHead(){
        if(isEmpty()){
            System.out.println("队列空");
            return ;
        }
        System.out.println(queue[(front+1)%max]);
    }
    //显示队列
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列空");
            return ;
        }
 
        //这里的判断条件还可以根据长度写,,,,
        for (int i = (front+1)%max; i != (tail+1)%max; ) {//注意判断条件
            System.out.print(queue[i]+"\t");
            i=(i+1)%max;
        }
        System.out.println();
    }
 
 
 
 
}

标准队列:front与tail初值为0,好写一点

 
class Queue03{
    //先进先出,数组模拟环形队列
    //功能:入队,出队,判满,判空,显示队头,显示队列
    //front=rear=0版
    private int max;
    private int front=0;
    private int tail=0;
    private int[] queue;
    public Queue03(int max){
        this.max=max+1;
        queue=new int[this.max];
    }
 
    //判空
    public boolean isEmpty(){
        return front==tail;
    }
    //判满
    public boolean isFull(){
        return (tail-front+1+max)%max==0;  //-1   4(不是5,要空出来一个位置防止冲突)
    }
    //入队
    public void pushQueue(int i){
        if(isFull()){
            System.out.println("队列满,无法入队");
            return;
        }
        queue[tail]=i;
        tail=(tail+1)%max;
        System.out.println("入队成功");
    }
    //出队
    public int popQueue(){
        if(isEmpty()){
            System.out.println("队列空,无法出队");
            return -9999;
        }
 
        int i= queue[front];
        front=(front+1)%max;
        return i;
    }
    //显示队头
    public void showHead(){
        if(isEmpty()){
            System.out.println("队列空");
            return ;
        }
        System.out.println(queue[front%max]);
    }
    //显示队列
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列空");
            return ;
        }
 
        //这里判断条件还可以根据长度写,,而不是临界条件
        for (int i = front; i != tail; ) {//注意判断条件
            System.out.print(queue[i]+"\t");
            i=(i+1)%max;
        }
        System.out.println();
    }
 
 
 
 
}

双端队列:

 
class Queue04{
    //两端插入与删除元素
    private int front=0;//指向第一个元素,初始赋值是为了判空,判满与操作的方便,否则应该是-1
    private int tail=0;
    private int[] queue;
    private int max;
    public Queue04(int max){
        this.max=max+1;
        queue=new int[max+1];
    }
    //判空
    public boolean isEmpty(){
        return front==tail;
    }
    //判满
    public boolean isFull(){
        return (tail+1-front+max)%max==0;
    }
    //队尾正常入队
    public void pushQueue(int i){
        if(isFull()){
            System.out.println("队列已满,队尾无法正常入队");
            return;
        }
        queue[tail]=i;
        tail=(tail+1)%max;
        System.out.println("正常入队成功");
    }
    //队头入队
    public void pushQueueFromHead(int i){
        if(isFull()){
            System.out.println("队列已满,无法从队头入队");
            return;
        }
        front=(front+max-1)%max;
        queue[front]=i;
        System.out.println("队头入队成功");
    }
    //队头正常出队
    public int popQueue(){
        if(isEmpty()){
            System.out.println("队列为空,队头无法正常出队");
            return -99999;
        }
        int k=queue[front];
        front=(front+1)%max;
        return k;
    }
    //队尾出队
    public int popQueueFormTail(){
        if(isEmpty()){
            System.out.println("队列为空,队尾无法出队");
            return -99999;
        }
        tail=(tail-1+max)%max;
        return queue[tail];
    }
    //显示队头
    public void showHead(){
        if(isEmpty()){
            System.out.println("队列为空,无法显示队头");
            return;
        }
        System.out.println(queue[front]);
 
    }
 
    //显示队尾
    public void showTail(){
        if(isEmpty()){
            System.out.println("队列为空,无法显示队尾");
            return;
        }
        System.out.println(queue[ (tail-1+max)%max ]);
 
    }
    //显示队列      显示队列没必要从后往前 接收front,tail数据--的循环罢了
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列为空,无法显示队列");
            return;
        }
        for (int i = front; i !=tail; ) {
            System.out.print(queue[i]+"\t");
            i=(i+1)%max;
        }
        System.out.println();
    }
 
 
 
}
单调队列
  具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作
  改一下双端队列就行了

标签:队列,双端,System,int,tail,max,front,单调,out
From: https://www.cnblogs.com/youye9527/p/17858106.html

相关文章

  • 堆和优先队列(洛谷P3378)
    1.优先队列解决:优先队列:头文件和定义:#include<queue>template<classT,classContainer=vector<T>,classCompare=less<typenameContainer::value_type>>classpriority_queue;可表达为以下形式:priority_queue<Type,Container,Functional>type:即数据的类型Co......
  • BlockingQueue阻塞队列
    BlockingQueue阻塞队列BlockingQueue简介juc包下,BlockingQueue很好的解决了多线程中,高效安全的"传输数据"问题。阻塞队列,是一个队列,可以是数据从队列的一端输入,从另一端输出。当队列空时,从队列获取元素线程被阻塞,直到其他线程向空的队列插入新元素。当队列满时,向队列添加元......
  • 2023.11.26 单调栈与字符串
    cf上的1886C从第一个字符开始往后,删除第一对第一个字符大于第二个字符的相邻字符组中的第一个字符。还没找到就一直入栈,当即将入栈元素和栈顶元素满足上述条件时,栈顶元素出栈,继续判断,直到待入元素满足入栈条件。(每一次有元素出栈,要执行一次查询位置减字符串长度,字符串长度减一) ......
  • 数据结构之优先队列(java)
    一:概述队列的特点是:先进先出(FIFO).入队列,将元素置于队尾;出队列,队头元素最先被移出:优先队列不遵循先入先出的原则,而是分两种情况。最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队。例如有一个最大优先队列,其中的......
  • 万字长文:从 C# 入门学会 RabbitMQ 消息队列编程
    RabbitMQ教程 目录RabbitMQ教程RabbitMQ简介安装与配置安装RabbitMQ发布与订阅模型生产者、消费者、交换器、队列多工作队列交换器类型DirectFanoutTopic交换器绑定交换器消费者、消息属性Qos、拒绝接收消息确认模式消息持久化消息TTL时......
  • 7-2 队列应用(蓝桥杯)
    importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner; publicclassMain{    publicstaticvoidmain(String[]args){        Scannersc=newScanner(System.in);        Queue<String>vip=newLinkedList<>();......
  • RabbitMQ -- 延迟队列(死信队列中的消息TTL过期)
    用来存放需要在指定时间被处理的元素队列,队列中的元素希望在指定时间被取出和处理使用场景:订单在十分钟内未支付自动取消新创建的店铺,如果在十天之内没有上传过商品,则自定发送消息提醒用户注册成功后,如果三天内没有登录则进行短信提醒用户发起退款后,如果三天内没有得到处理则通知相......
  • Odoo16_queue_job第三方异步队列
    1.安装第三方模块queue_jobqueue/queue_jobat16.0·OCA/queue·GitHub2.odoo配置文件,启动多workersworkers=3proxy_mode=Trueserver_wide_modules=web,queue_job[queue_job]channels=root:23.使用方法fromodooimportmodels,fields,apiclass......
  • 队列存放用户请求,执行耗时操作的解决方案
    队列存放用户请求的实现方案直接上图待补充……......
  • 推箱子保证单调性的正确性
    如果保证了单调性,那么一个状态在出队的时候,一定是这个状态的最优情况反证,如果不是最优情况,那么肯定存在一个状态A,A能到达这个状态且会让这个状态变优由于这个状态变优了,要么就是箱子移动的步数少了,要么就是箱子移动的步数是一样的但人移动的步数少了然后这个更优的状态是由A移......