例1
题号:剑指offer09, 难度:简单
题目描述:
解题思路:
学习剑指offer上的思想,模拟一下过程,假设abc三个元素插入队尾,逐个压进stack1,{a,b,c}。这时候要删除一个元素,应该删除a,但是a在栈底。所以要把stack1里的元素逐个弹出和压入stack2,{c,b,a}在stack2中,a在栈顶,删除直接弹出就可以了。a删除后,stack2里还剩下{c,b},如果还要删除的话,下一个弹出b,结果也是对的。这时候插入一个元素d,d被压入stack1,stack2里还剩下{c},下一次删除的时候把c弹出去,顺序正确。
条件是:stack2为空时候,把stack1中所有元素逐个弹出并压入stack2。如果stack1执行完这个操作后,stack2还没有元素(stack1和stack2都没有元素了),就返回-1。否则正常执行删除操作,保存stack的栈顶,然后弹出栈顶元素。返回保存的栈顶。
具体代码:
class CQueue {
stack<int>stack1,stack2;
public:
CQueue() {
}
void appendTail(int value) {
stack1.push(value);
}
int deleteHead() {
if(stack2.size() <= 0)
{
while(stack1.size() > 0)
{
int num = stack1.top();
stack1.pop();
stack2.push(num);
}
}
if(stack2.size() == 0)
{
return -1;
}
int head = stack2.top();
stack2.pop();
return head;
}
};
例2
题号:剑指offer 30, 难度:简单
题目描述:
解题思路:
stack1插入数据的时候,stack2插入当前的最小值。
具体代码:
class MinStack {
stack<int>stack1,stack2;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
stack1.push(x);
if(stack2.size() == 0 || x < stack2.top())
{
stack2.push(x);
}
else
{
stack2.push(stack2.top());
}
}
void pop() {
assert(stack1.size() > 0 && stack2.size() > 0);
stack1.pop();
stack2.pop();
}
int top() {
return stack1.top();
}
int min() {
assert(stack1.size() > 0 && stack2.size() > 0);
return stack2.top();
}
};
总结
我本来设置了一个成员变量,然后用::min函数比较最小值,有些麻烦还容易错。学习题解里的直接跟stack2栈顶比较,是不是最小值。