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

每日写题分享--包含min函数的栈/双栈实现

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

每日写题分享--包含min函数的栈/双栈实现

题目描述:

 题目链接:包含min函数的栈

思路:

1.建立两个栈,一个是存储所有数据并可以正常实现push,pop,peek等函数的数据栈stack1,一个是存储stack1非严格降序的辅助栈stack2。stack2的栈顶元素始终是数据栈stack1中的最小元素。

2.在stack1执行push()函数入栈的时候,判断如果stack2为空,就也给stack2入栈该元素。当stack2不为空的时候,stack2只入栈比stack2栈顶元素小的元素。这样就保证了stack2的栈顶元素是最小的元素。

3.为了维护stack2的栈顶元素一直是最小的元素,在stack1出栈的时候,stack2也要做出相应的动作。

        如果stack1出栈的元素比stack2栈顶元素大,则不做处理。

        但如果stack1出栈的元素和stack2的栈顶元素相等,就要同时给stack2的栈顶元素出栈。

        由于stack2入栈的规则是只入小的,也就是stack2内部相当于是降序的,而stack2存储的是最小值,所以stack1出栈的值不可能比stack2的栈顶元素小。

代码实现如下:

class MinStack {
     Stack stack1;
     Stack stack2;
    
    public MinStack() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void push(int x) {
        stack1.add(x);
        if (stack2.empty() || stack2.peek() >= x) {
            stack2.add(x);
        }

    }
    
    public void pop() {
        int val = stack1.pop();
        if (stack2.peek() == val) {
            stack2.pop();
        }
    }
    
    public int top() {
        return stack1.peek();
    }
    
    public int min() {
        return stack2.peek();                  
    }
}

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

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

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