
最小栈
题目来源:LeetCode155.最小栈
思路
开辟两个栈,以空间换时间,当第一个栈push和pop操作时,第二个栈也进行push和pop操作,
第二个栈push的条件:1.栈为空,2.push的数据比上个存储的数据小,3.push的数据与上个存储的数据相等。
第二个栈pop的条件:第一个栈pop的数据值如果和第二个栈内的数据值相同,那么第二个栈也pop
这样最后留在第二个栈的元素就是最小元素
回顾旧知识:我们要写栈的构造函数吗?
不用写,可删也可不删
可删是因为如果没有构造函数,我们不写编译器会默认生成一个,对自定义类型不做处理,对内置类型调用它的默认构造函数
可以留着啥也不写是因为如果不写,它所有的成员会这初始化列表,走初始化列表会调用它的默认构造函数
代码实现
class MinStack {
public:
MinStack() {
}
void push(int val) {
_stack.push(val);
if(_minstack.empty() || val <= _minstack.top())
_minstack.push(val);
}
void pop() {
if(_stack.top() == _minstack.top())
_minstack.pop();
_stack.pop();
}
int top() {
return _stack.top();
}
int getMin() {
return _minstack.top();
}
stack<int> _stack;
stack<int> _minstack;
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
终极问题:如果插入的数据有大量重复怎么办?
minst内存结构体,结构体内一个是值,一个是计数,如果重复就++计数count
栈的压入_弹出序列
JZ31栈的压入弹出序列
思路
这题的思路很巧妙,我也是看了大佬的代码才恍然大悟,这题居然可以这么玩
我们实际上只需要模拟一遍入栈出栈的过程,就能完成这题了
#include <cstddef>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pushV int整型vector
* @param popV int整型vector
* @return bool布尔型
*/
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
stack<int> st;
size_t pushi = 0,popi = 0;
while(pushi < pushV.size())
{
st.push(pushV[pushi++]);
while(!st.empty() && st.top() == popV[popi])
{
st.pop();
++popi;
}
}
return st.empty();
}
};
我们对栈的入栈出栈过程一定要了然于胸!