剑指Offer-第1天 栈与队列(简单)
第一题
题目链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
个人题解:双栈,一个当作,一个当作输出。
- 将一个栈当作输入栈,用于压入数,另一个栈当作输出栈,用于弹出数。
- 当我们需要删除时 \(deleteHead\) ,输出栈如果为空,则依次压入输出栈。
点击查看代码
class CQueue {
public:
stack<int> c1,c2;
CQueue() {
while(!c1.empty()) c1.pop();
while(!c2.empty()) c2.pop();
}
void appendTail(int value) {
c1.push(value);
}
int deleteHead() {
if(c2.empty())
{
while(!c1.empty())
{
c2.push(c1.top());
c1.pop();
}
}
if(c2.empty()) return -1;
else
{
auto x1=c2.top();
c2.pop();
return x1;
}
}
};

第二题
题目链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
个人题解:双栈,一个栈实现普通的操作,另一个栈(单调栈)实现找最小值。
- 需要维护一个单调栈,来实现返回最小值的操作。
- 当一个元素要入栈时,取出数,如果该数 \(\le\) 单调栈的栈顶元素,则将该数同时压入单调栈中;
- 当一个元素要出栈时,辅助栈的栈顶元素也一并弹出;
- 因为我们的辅助栈是单调栈,单调栈具有单调性,所以它的栈顶元素就是当前栈中的最小数。
我的代码
class MinStack {
public:
/** initialize your data structure here. */
stack<int> now,mins;
MinStack() {
}
void push(int x) {
now.push(x);
if(mins.empty() || mins.top()>=x) mins.push(x);
}
void pop() {
if(mins.top()==now.top()) mins.pop();
now.pop();
}
int top() {
return now.top();
}
int min() {
return mins.top();
}
};
结果:


浙公网安备 33010602011771号