设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
解题思路:
用两个栈来实现最小栈,一个用来进行基本的push、pop、top操作,称为数据栈;另一个栈用来存放数据栈里的最小元素,称为最小栈。
1、入栈
数据栈入栈所有元素,最小栈为空时入栈第一个元素,入最小栈的下一个元素必须小于当前最小栈的栈顶元素,否则不入最小栈。
2、出栈
数据栈元素出栈时势必会影响栈内最小元素的取值,所以当数据栈元素出栈时,当数据栈栈顶与最小栈栈顶相同时,最小栈中的元素也进行出栈操作。
3、求栈顶
即返回数据栈的栈顶元素即可
4、求栈内最小元素
在最小栈里取栈顶元素即可
#include <iostream>
#include <stack>
using namespace std;
class MinStack {
stack<int> m_data;//数据栈
stack<int> m_min;//最小栈
public:
//构造函数
MinStack() {
}
//入栈操作
void push(int x)
{
m_data.push(x);//将元素入栈到数据栈
if (m_min.empty() || m_min.top() > x)
{
m_min.push(x);//当最小栈为空或者其栈顶元素大于x时让其入最小栈
}
}
//出栈操作
void pop()
{
if (m_data.top() == m_min.top())
{
m_min.pop();//两个栈栈顶元素相同时,最小栈执行出栈操作
}
m_data.pop();//数据栈出栈
}
//求栈顶
int top()
{
return m_data.top();
}
//求栈里最小元素
int getMin() {
return m_min.top();//即最小栈的栈顶元素
}
};