设计一个支持?push
?,pop
?,top
?操作,并能在常数时间内检索到最小元素的栈。
实现?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();
};
};