stack刷题

简介: stack刷题

最小栈

最小栈

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

思路:使用两个栈,一个栈作为普通的栈,push、pop、top等操作;另一个栈,判断要 push的元素是否是栈中的最小值,是就 push。这保证了 第二个栈的栈顶元素永远就是堆栈中的最小元素。

pop 元素的时候,如果第二个栈的栈顶元素和第一个栈的栈顶元素相同时,再 pop 第二个栈的栈顶元素。

class MinStack {
public:
    MinStack() {}
    void push(int val) {
        st1.push(val);
        if(st2.empty() || val <= st2.top()) st2.push(val);
    }
    void pop() {
        if(st1.top()==st2.top()) st2.pop();
        st1.pop();
    }
    int top() {
        return st1.top();
    }
    int getMin() {
        return st2.top();
    }
    stack<int> st1;
    stack<int> st2;
};

栈的压入、弹出序列

栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

1.  0<=pushV.length == popV.length <=1000

2.  -1000<=pushV[i]<=1000

3.  pushV 的所有数字均不相同

思路:模拟这个入栈、出栈序列

依次入栈,直到栈顶元素等于出栈序列的第一个元素,这时候就出栈,再次判断栈顶元素是否等于出栈序列的下一个元素,等于就出栈,直至不等于或栈为空时,继续入栈。

当入栈序列被遍历结束后,模拟入栈、出栈这个过程就结束了。判断出栈序列是否可以满足这个入栈序列:当栈最终为空时,说明出栈序列可以匹配入栈序列,返回 true,否则就是不匹配,返回 false

class Solution {
public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        // write code here
        int cur1 = 0,cur2 = 0, n = pushV.size();
        stack<int> st;
        while(cur1 < n)
        {
            st.push(pushV[cur1++]);
            while(!st.empty() && st.top() == popV[cur2])
            {
                st.pop();
                cur2++;                
            }
        }
        return st.empty();
    };
};
相关文章
|
1月前
|
算法 Java 关系型数据库
JVM GC 深度破局:G1 与 ZGC 底层原理、生产调优全链路实战
本文深度解析JDK17主流GC:G1(默认,兼顾吞吐与延迟)与ZGC(革命性低延迟,STW&lt;1ms)。涵盖核心理论(可达性分析、三色标记)、内存布局、全流程机制(SATB写屏障 vs 染色指针+读屏障)、关键参数调优及生产选型指南,助你精准定位性能瓶颈,高效优化JVM。
590 4
|
9月前
|
NoSQL Redis
功能最全面最快的redis备份工具
现在使用云的人越来越多,redis数据跨云备份,跨云迁移的需求也越来越多,备份这么重要的东西,肯定要选最好的客户端。现在做数据备份和恢复的产品,也就yunedit-redis这款redis客户端能考虑所有这些场景,而且导出导入速度也是做到客户端导出比在服务端导出还快的效果。实测导出20万数据只用时十多秒。在备份这个领域,yunedit-redis应该是最好的。
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
952 3
|
Java
Java线程池核心数为0时,线程池如何执行?
【8月更文挑战第11天】Java线程池核心数为0时,线程池如何执行?
720 1
|
消息中间件 Java 中间件
如何在Java项目中实现分布式事务管理
如何在Java项目中实现分布式事务管理
|
监控 Dubbo 应用服务中间件
Dubbo如何支持本地调用?injvm方式解析
Dubbo是一个远程调用的框架,对于一个服务提供者,暴露了一个接口供外部消费者调用,那么对于提供者自己是否可以调用这个接口,需要什么特殊处理吗?
5917 0
|
存储 关系型数据库 MySQL
MySQL中的WAL技术
MySQL中的WAL技术
|
消息中间件 Java 调度
53. 面试官:谈一下数据库分库分表之后,你是如何解决事务问题?
53. 面试官:谈一下数据库分库分表之后,你是如何解决事务问题?
295 1
53. 面试官:谈一下数据库分库分表之后,你是如何解决事务问题?
|
存储 算法 安全
JDK1.8中的ConcurrentHashMap使用及场景分析
JDK1.8中的ConcurrentHashMap使用及场景分析
JDK1.8中的ConcurrentHashMap使用及场景分析
|
SQL 小程序 分布式数据库
百亿级数据 分库分表 后怎么分页查询?
百亿级数据 分库分表 后怎么分页查询?
百亿级数据 分库分表 后怎么分页查询?