数据结构(data structure)(3)栈和队列

栈的定义

stack有称堆栈
栈顶top
栈顶元素
栈底bottom
空栈
进展或入栈
出栈或退栈

Last In First Out
LIFO后入先出

public interface IStack<T> extends MysList<T>{
   // 元素入栈
   void push(e);
    //出栈
   T pop(){};
   //判空
   boolean empty();
    //栈的大小
   int getSize();
}

public class ListNode<T>{
    T data;
    ListNode<T> pre;
    ListNode<T> next;

    public ListNode(T data){this.data=data;}

    public T getData(){return data;}

    public ListNode<T> getPre(){return pre;}

    public void setNext(ListNode<T> next){this.next=next;}

    public void setPre(ListNode<T> pre){this.pre=pre;}

}

public class MyStack<T>extends DOubleLinked<T>implements IStack<T>{

    public void push(T e){
        super.add(e);
    }

    public T pop(){
     if(size==0)throw new EmptyStackException();
     ListNode<T> the =super.last.getPre();
     T res=the.getData();

    the.getPre().setNext(last);
    last.setPre(the.getPre());
    the.setNext(null);
    the.setPre(null);
    size--;
    return res;

    }

    public boolean empty(){
    return getSize()==0;
    }

    public int getSize(){return super.getSize();}

}

队列的实现

 

queue
队尾入,队首出
入队,出队
队尾元素,对首元素
先进先出
First In First Out(FIFO)


public interface IQueue<T>{
    //入队
    void enquque(T e);
    //出队
    T dequque();
    //返回队列的大小
    int getSize();
    //判断是否为空
    boolean empty();
    //取队首元素
    T peek();

}

public class MyQueue<T> extends DoubleLinkedList<T> implements IQueue{
    public void  enqueue(T e){
        super.add(e);
    }

    public T dequeue(){
        ListNode h=first.getNext();
        first.setNext(h.getNext());
        h.getNext().setPre(first);
        h.setPre(null);
        h.setNext(null);
        size--;
        return h.getData;
    }

    public boolean empty(){
    return getSize()==0;
    }

    public T peek(){
    return first.getNext.getData();
    }
}

栈和队列的例题

如何用一个数组来实现三个栈
记录三个栈顶的下标
//栈中实现min方法,可取出栈中最小值
public Int min(){
    ListNode<T> h=first.getNext();
    int min=-1;
    while(h!=last){
        if((int)h.getData()<min){
            min=(int)h.getData();
        }
    }
    return min;
}

//再创一个栈,记录最小值,保证每次入栈的都是当前栈里的最小值
public void push(Integer e){
    supper.add(e);
    if(brother.empty()){
    brother.push(e);
    }else{
     Integer peek=brother.peek();
     if(e<peek){
     brother.push(e);
     }else{
        brother.push(peek);
     }
    }
}

public Integer pop(){
    if(size<=0)throw new EmptyStackException();
    ListNode<Integer> the=super.last.getPre();
    Integer res=the.getData();

    the.getPre().setNext(last);
    last.setPre(the.getPre());
    the.setNext(null);
    the.setPre(null);
    size--;
    brother.pop();
    return res;
}

实现setOfStacks

 

setOfStacks由多个栈组成,前一个栈填满时新建一个栈,

给定一个操作序列int[][2] ope,每个操作的第一个数代表操作类型
若为1,则为push操作,后一个数为应push的数字
若为2,则为pop操作,后一个数字无意义
请返回一个int[][](c++为vector&ltvector&ltint>>),为完成所有操作后的setOfStacks,顺序为从下到上,默认初始的setOfStacks为空
保证数据合法

public ArrayList<ArrayList<Integer>>setOfStacks(int[][] ope,int size){
        ArrayList<ArrayList<Integer>>res=new ArrayList<>();
        ArrayList<Integer> currStack=new ArrayList<>(size);
        res.add(currStack);
        for(int[] opAndValue:ope){
            int op=opAndValue[0];
            int value=opAndValue[1];
            if(op==1){
                if(currStack.size()==size){//当前满
                currStack=new ArrayList<Integer>(size);//创建一个新的栈
                res.add(currStack);
                }
                currStack.add(value);
            }else{//出栈
                if(currStack.size()==0){
                res.remove(currStack);//栈的列表中移除
                currStack=res.get(res.size()-1);//被操作的栈是列表中的上一个栈
                }//线性表的下标是从0开始的
                currStack.remove(currStack.size()-1);
            }

        }
}


两个栈来实现一个队列
先将元素压入一个栈,当要取元素时,将元素出栈压入另一个栈,再出栈,即可得到队列

 public class SQueueByTwoStakc{
    Stack<Integer> stack1=new Stack();
    Stack<Integer> stack2=new stack();

    public  void enqueue(int node){
        if(stack1.isEmpty())}
          move(stack2.stack1);
        }
        stack1.push(node);
    }
    public int dequeue(){
    move(stack1,stack2);
    int result=stack2.pop();
    move(stack2,stack1);
    return result;
    }

    private void move(Stack source,Stack target){
        while(!source.empty()){
        target.push(source.pop());
        }
    }
 }


请编写一个程序,按升序对栈进行排序

 

请编写一个程序,按升序对栈进行排序,(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中
给定一个int[] number,其中第一个元素为栈顶,请返回排序后的栈,请注意这是一个栈,意味着排序过程中你只能访问到第一个元素
[1,2,3,4,5]
返回:[5,4,3,2,1]

public class TowStacksSort{
    //初始化原始栈
    Stack<Integer>source=new  Stack<>();
    for(int i=numbers.length;i>=0;i--){
        source.push(numbers[i]);
    }

    Stack<Integer> target=towStackSort(source);
    ArrayList<Integer> list=new ArrayList<>();
    while(!target.empty()){
        list.add(target.pop());
    }
    return list;
}


private void sortToTarget(Stack<Integer>source,Stack<Integer> target){
        while(!source.empty()){
            int v1=source.pop();//揭开盖子
            if(target.empty()){
                target.push(v1);
            }else{
            int v2=target.peek();
            if(v1>=v2){//盖子大,直接放入
            target.push(v1);
            }else{//盖子小,把大的往回收
            source.push(target.pop());

            while(!target.empty()&&v1<target.peek()){
            source.push(target.pop());
            }//直到盖子比peek大

            target.push(v1);//放入盖子
            }

            }
        }
}

猫狗收容所

 

有家动物收容所只收留猫和狗,担忧特殊的收养规则,收养人有两种或收养方式
第一种为直接收养所有动物中最早进入收容所的
第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的

给定一个操作系统(int[][2] ope)代表所有时间
若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫
若第一个元素为2,则代表有人收养动物i,,第二个元素若为0,则采取第一种收养方式(最早)
若为1,则指定收养狗,若为-1,则指定收养猫
请按顺序返回收养的序列,若出现不合法的操作,则没有可以复合领养要求的动物,则将这次领养操作忽略
[1,1],[1,-1],[2,0],[2,-1]

返回:[1,-1]

public class CatDogAsylum{
        private static class Animal{
        int type;
        int time;
        static int timeline;//全局变量,记录动物的时间点

        public Animal(int typeNumber){
           this.type=typeNumber;
            this.time=timeline++;
        }
        }

       public ArrayList<Integer> asylum(int[][] ope){

            ArrayList<Integer>res=new ArrayList<>();

            Queue<Animal> cats=new LinkedList<>();
            Queue<Animal> dogs=new LinkedList<>();

            for(int[] row:ope){
                int p=row[0];
                int typeNumber=row[1];
                if(op==1){//增加
                    if(typeNumber>0){
                    dogs.add(new Animal(typeNumber));
                    }
                    if(typeNumber<0){
                    cats.add(new Animal(typeNumber));
                    }
                }else if(op==2){//减少
                    if(typeNumber==0){//从两个队列中选timeline最小的
                        if((!dogs.isEmpty())&&(cats.isEmpty()||dogs.peek().time<cats.peek().time)){
                            res.add(dogs.poll().type);
                        }
                         else if((!cats.isEmpty())&&(dogs.isEmpty()||dogs.peek().time<cats.peek().time)){
                            res.add(cats.poll().type);
                        }
                          else{//用户指定了类型
                            if(typeNumber==1&&!dogs.isEmpty()){
                          res.add(dogs.poll().type);
                          }

                           if(typeNumber==-1&&!cats.isEmpty()){
                            res.add(cats.poll().type);
                            }
                        }
                    }else{
                    break;
                    }
                }
                return res;
            }
       }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/560447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

存储过程的使用(二)

目录 带 OUT 参数的存储过程 输入一个编号&#xff0c;查询数据表 emp中是否有这个编号&#xff0c;如果有返回对应员工姓名&#xff0c;如果没有&#xff0c;则提示没有对应员工 使用 EXEC 命令或者 PRINT执行含有 OUT参数的存储过程 使用 PL/SQL 块编辑程序调用含有 OUT …

JAVA 项目<果园之窗>_2

上节主要是理论流程&#xff0c;这次直接用实际例子过一遍整个流程 目标是向数据库添加一个员工 上述是前端页面&#xff0c;点击保存 浏览器向我后端发送http请求 后端这一部分专门接收employee请求 在这里对http post请求进行转换成JAVA数据&#xff0c;并处理数据&#xff…

Spring Boot后端与Vue前端融合:构建高效旅游管理系统

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

python_列表和元组

介绍 列表&#xff08;List&#xff09;和元组&#xff08;Tuple&#xff09;是Python中两种不同的数据结构&#xff0c;它们都可以用来存储一系列的元素。下面是它们的主要特点和区别&#xff1a; 列表&#xff08;List&#xff09; 可变性&#xff1a;列表是可变的&…

广西模板厂有哪些厂家

在广西地区&#xff0c;建筑行业蓬勃发展&#xff0c;建筑模板作为建筑施工的重要材料&#xff0c;需求量逐渐增加。在这个市场中&#xff0c;贵港市能强优品木业有限公司以其卓越的产品质量和丰富的生产经验而闻名&#xff0c;成为广西地区的知名建筑模板生产厂家。 作为一家具…

OpenCV4.9使用 inRange 的阈值操作

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV4.9​​​​基本阈值操作 下一篇&#xff1a;利用OpenCV4.9制作自己的线性滤波器&#xff01; ​目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV cv&#xff1a;&#xff…

【错题集-编程题】大数乘法(模拟 + 高精度乘法)

题目链接&#xff1a;大数乘法_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 根据列竖式运算的过程模拟即可&#xff0c;但是我们可以改进⼀下列竖式的过程&#xff1a; 先计算⽆进位相乘并且相加后的结果&#xff1b;然后再处理进位。 细节&#xff1a;题目所给的两个字符串…

OpenHarmony 视频播放开发教程~

介绍 本示例主要展示了网络视频播放的相关功能。使用ohos.multimedia.avsession等接口实现视频播放的功能。 效果预览 主页 使用说明 点击播放按钮&#xff0c;应用的播放状态发生变化。点击暂停按钮&#xff0c;应用的播放状态开始变化。点击上一个按钮&#xff0c;界面展…

Ribbon 添加快速访问区域

添加快速访问区域挺简单的&#xff0c;实例如下所示&#xff1a; void QtRightFuncDemo::createQuickAccessBar() { RibbonQuickAccessBar* quickAccessBar ribbonBar()->quickAccessBar(); QAction* action quickAccessBar->actionCustomizeButton(); act…

如何查找一篇英文文献的源代码?(论文中没有源代码链接时)如何查找一篇论文的实现代码从而复现论文?

有两个网址&#xff0c;从这两个网址里面能找到论文相关代码&#xff0c;但不确定是不是人家论文里的源代码&#xff0c;但是根据论文实在找不到的情况下&#xff0c;只能试试这两个网址了 1. https://paperswithcode.com/ 2. https://www.catalyzex.com/

团队协作:如何利用 Gitee 实现多人合作项目的版本控制

文章目录 前言一、名词解释1、Git是什么&#xff1f;2、Gitee、GitHub和GitLab 二、操作步骤1.安装Git2.创建Gitee仓库3.用vscode连接仓库4. 克隆远程仓库 总结 前言 在软件开发中&#xff0c;有效地管理代码是至关重要的。Gitee 是一个功能强大的代码托管平台&#xff0c;提供…

Sentinel 流控注解使用

大概原理&#xff1a;通过反射解析注解 SentinelResource信息完成调用&#xff0c;处理方法&#xff0c;类似AOP编程 处理方法的返回类型要保持一致&#xff0c;参数和顺序保持一致&#xff0c; 可以在参数列表最后加 com.alibaba.csp.sentinel.slots.block.BlockException; …

探索C语言数据结构:利用顺序表完成通讯录的实现

在好久之前我就已经学习过顺序表&#xff0c;但是在前几天再次温习顺序表的时候&#xff0c;我惊奇的发现顺序编表可以完成我们日常使用的通讯录的功能&#xff0c;那么今天就来好好通过博客总结一下通讯录如何完成吧。 常常会回顾努力的自己&#xff0c;所以要给自己的努力留…

【JavaSE】浅谈Java异常

前言 本篇文章是对Java异常体系相关内容及部分注意事项的的讲解。 一. 认识异常 在每个人的生命历程中&#xff0c;或多或少都会遇到生病或受伤的情况&#xff0c;比如&#xff1a;皮肤擦伤、感冒、发烧、患上某些传染病等等。不管“病情”严重与否&#xff0c;这些都可以算…

数据链路层协议——以太网协议

目录 要解决的问题 以太网协议 以太网帧格式 MAC地址 MAC地址和IP地址 MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 ARP协议 ARP协议格式 ARP协议的工作流程 ARP缓存表 要解决的问题 上一篇我们也说了&#xff0c;数据从应用层一步步封装到了网…

leetcode:滑动窗口----3. 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

工业现场ModbusTCP转EtherNETIP网关引领生物现场领新浪潮

生物质发生器是一种能够产生、培养生物的设备。客户现场需要将生物发生器连接到罗克韦尔系统&#xff0c;但是二者协议无法直接通讯&#xff0c;需要通过开疆智能ModbusTCP转Ethernet/IP网关将两者进行通讯连接&#xff0c;生物质发生器以其独特的工作原理和优势&#xff0c;使…

【命名空间详解】c++入门

目录 命名空间的定义 1.命名空间的正常定义 2.命名空间还可以嵌套 3. 命名空间可以合并 命名空间的使用 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 输入&#xff0c;输出 输出 命名空间的定义 …

[阅读笔记21][RA-CM3]Retrieval-Augmented Multimodal Language Modeling

这篇论文是meta联合斯坦福在23年4月发表的论文&#xff0c;提出了一个使用外部知识检索增强的多模态模型。 这篇模型提出的RA-CM3模型是第一个能够检索并生成图像文本的多模态模型&#xff0c;在图像文本生成任务上优于现有的多模态模型&#xff0c;同时使用更少的训练量。 RA-…

在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

文章目录 存储二进制文件为大对象步骤 1&#xff1a;创建一个大对象步骤 2&#xff1a;写入数据到大对象 检索大对象为二进制文件步骤 1&#xff1a;打开大对象以进行读取步骤 2&#xff1a;从大对象读取数据 注意事项 PostgreSQL 提供了对大对象&#xff08;Large Objects&…
最新文章