当前位置: 首页 > article >正文

用队列实现栈和用栈实现队列(下)

目录

一.队列实现栈:题目链接

         题解代码:

        题解思路:

        二.栈实现队列:题目链接

         题解代码:

        题解思路:


一.队列实现栈:题目链接

         题解代码:

private Queue<Integer> s1;
    private Queue<Integer> s2;


    public MyStack() {
        s1 = new LinkedList<>();
        s2 = new LinkedList<>();

    }
    
    public void push(int x) {
        if(empty()) {
            s1.offer(x);
            return;
        }

        if(!s1.isEmpty()) {
            s1.offer(x);
        } else {
            s2.offer(x);
        }
    }
    
    public int pop() {
        if(empty()) {
            return -1;
        }
        if(s1.isEmpty()) {
            int a = s2.size(); 
            while(a - 1 != 0) {
                s1.offer(s2.poll());
                a--;
            }
            return s2.poll();
        } else {
             int a = s1.size(); 
            while(a - 1 != 0) {
                s2.offer(s1.poll());
                a--;
            }
            return s1.poll();
        }
    }
    
    public int top() {
         if(empty()) {
            return -1;
        }
        if(s1.isEmpty()) {
            int a = s2.size(); 
            int tem = 0;
            while(a != 0) {
                tem = s2.poll();
                s1.offer(tem);
                a--;
            }
            return tem;
        } else {
             int a = s1.size(); 
             int tem = 0;
            while(a != 0) {
                tem = s1.poll();
                s2.offer(tem);
                a--;
            }
            return tem;
        }
    }
    
    public boolean empty() {
        return s1.isEmpty() && s2.isEmpty();
    }

        题解思路:

        首先,对于这个问题,我们可以使用两个队列来实现一个栈,保证其中栈的 入元素,出元素,获取栈顶元素 和 判断栈是否为空的基本方法是否有效

        入元素

        如果两个队列都为空的话,我们默认入元素在 s1队列里面。

        如果只是其中一个队列为空的话,则入元素在为空的队列里。

        出元素

        先判断两个队列是否都为空,防止异常。

        先判断那个队列为空,再把不空的队列里的元素放到空的队列里,不空的队列里剩下最后一个元素就是要出的元素。

        获取栈顶元素

        这里的实现逻辑与出元素的逻辑很相像,不同的是,在放元素之前定义了一个整型变量用来存储每次出元素的值,就不用特意剩下一个元素在之前的队列里了,直接返回最后一个tem值就是要获取的栈顶元素。

        

        二.栈实现队列:题目链接

         题解代码:

private Stack<Integer> s1;
    private Stack<Integer> s2;

    public MyQueue() {
        s1 = new Stack<>();
        s2 = new Stack<>();

    }
    
    public void push(int x) {
       
        s1.add(x);
       
    }
    
    public int pop() {
        if(empty()) {
            return -1;
        }
        if(s2.empty()) {
            while(!s1.empty()) {
                s2.add(s1.pop());
            }
        }
         return s2.pop();
    }
    
    public int peek() {
        if(empty()) {
            return -1;
        }
        if(s2.empty()) {
            while(!s1.empty()) {
                s2.add(s1.pop());
            }
        }
         return s2.peek();
    }
    
    public boolean empty() {
        return s1.empty() && s2.empty();
    }

        题解思路:

        首先,在这里我们使用两个栈来实现一个队列,还是一样,要保证其中队列的 入元素,出元素,获取队列首元素 和 判断队列是否为空的基本方法是否有效

        这里我们默认入元素都是在 栈s1里。出元素在栈s2里完成。

        对于出元素

        在之前要判断两个栈是否都为空,防止异常。

        然后,如果栈s2为空,则把栈s1里的元素全部放到栈s2里,之后再出元素。

        对于获取队列首元素

        与出元素逻辑类似,不同的是代码最后是peek方法。


http://www.kler.cn/a/501967.html

相关文章:

  • 【机器学习】无监督学习携凝聚型层次聚类登场。无需预设标签,仅凭数据内在特质,逐步归拢聚合,挖掘隐藏群组,为复杂数据剖析开启智能、高效的新思路。
  • 性能测试工具Jmeter事务处理
  • 【集成学习】Boosting算法详解
  • Flink基础概念
  • 解码 Web3:区块链如何编织去中心化之网
  • 深入解析 C++ 类型转换
  • Go语言的计算机基础
  • 创建 WordPress 插件(第一部分):添加管理页面
  • NBC模型【机器学习】
  • 【日常小记】Ubuntu启动后无图形界面且网络配置消失
  • SpringBoot源码解析(七):应用上下文结构体系
  • 电商项目-基于ElasticSearch实现商品搜索功能(三)
  • Redis常见
  • apache age:22023,42883,等报错信息
  • spring mvc源码学习笔记之十一
  • EF Core一对一和多对多
  • AI的崛起:它将如何改变IT行业的职业景象?
  • 多模态论文笔记——CLIP
  • C#上位机通过CAN总线发送bin文件
  • 高阶C语言|探索指针的根源之目(进阶指针)