问题:已知下面Stack类以及其三个方法push、pop和count,请用两个栈实现队列类的入队和出队的方法
这道题在面试中出现主要考察三点:
1、在短时间内,能不能找到这道题足够清晰的思路(思维的敏捷和清晰)
2、能不能在单向表述中,清楚的描述自己的思路和想法(表达能力)
3、对于一些具体的细节能否考虑到
大多数人的思路为:
入队时:将元素压入s1
出队时:将s1的元素逐个弹出并压入s2中,将s2的顶元素作为出队元素,之后再将s2剩下的元素逐个倒回s1中
优化:在出队的时候,不用全部倒入到s2中,因为可以将最后一个元素直接弹出,可以减少一次压栈的操作
变种思路:
入队时:先判断s1是否为空,如果不为空,说明元素都在s1中,此时将入队元素直接压入s1中;如果为空,要将s2中的元素倒回s1中再压入入队元素
出队时:先判断s2是否为空,如果不为空,直接将s2的顶元素出队;如果为空,将s1的元素逐个倒入s2中,并把最后一个元素直接弹出并出队。
最终变种思路:
入队时:将元素压入s1
出队时:判断s2是否为空,如不为空,则直接弹出顶元素;如果为空,则将s1的元素逐个倒入到s2中,并把最后一个元素弹出并出队
以上几个思路还需要考虑到一种情况,就是没有元素可供出队时的处理(两个栈都为空的时候,出队一定会引起异常)
代码如下:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int a;
if(stack2.empty()){
while(!stack1.empty){
a=stack1.top();
stack2.push(a);
stack1.pop();
}
}
a = stack2.top();
stack2.pop();
return a;
}
private:
stack<int> stack1;
stack<int> stack2;
};
拓展:用两个队实现一个栈的功能
思路:
入栈:将元素进队列A
出栈:判断队列A中元素的个数是否为一,如果等于一,则出队列,否则将队列A中的元素依次出队列并放入队列B中
直到队列A中的元素留下一个,然后队列A出队列,再把队列B中元素出队列依次放入队列A中