原题
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
Reference Answer
解题思路:
用两个栈来实现队列的增添元素和删除元素,队列是一种特殊的线性结构,它只允许从队列的开始端(font)删除元素,从队列的末尾(rear)插入元素,特点是先进先出(FIFO)。
- 入队:将s1作为入队操作的栈,当需要添加元素时,将其添加到栈中,要注意两点,若元素都存放在栈s2中,s1 为空,那么要先将s2中的元素倒入s1,再做添加新元素
- 出队: 将s2作为出队操作的栈,需要删除元素时,要特别注意的是,一定要判断栈不为空才可以进行删除操作,还有一点是若元素都存放在栈s1中,s2 为空,那么要先将s1中的元素倒入s2,再删除元素
可以提高效率的点: - 就像上面链接中提到的,大概有两点:
- 其一是删除操作时,如果需要将元素从s1倒入s2,大可不必都倒入,只倒入len(s1)-1,剩下的那个元素就是需要删除的,直接pop就可以了
- 其二是我们添加、删除操作后就保持栈的这个状态就好,以防下一次还是与上次同样的操作,可以节省元素在两个栈倒来倒去的时间
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, node):
# write code here
self.stack1.append(node)
def pop(self):
# return xx
if self.stack2:
return self.stack2.pop()
else:
self.stack2 = [i for i in self.stack1[::-1]]
self.stack1 = []
return self.stack2.pop()
C++ Version:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if (stack2.empty()){
while(stack1.size() > 0){
stack2.push(stack1.top());
stack1.pop();
}
}
int res = stack2.top();
stack2.pop();
return res;
}
private:
stack<int> stack1;
stack<int> stack2;
};
Note:
- 对于本题中,构造stack2时候,直接使用列表构建表达式,很简洁:
self.stack2 = [i for i in self.stack1[::-1]]
- python中的list的pop方法是要带括号的,即
list.pop()
,该调用默认会返回list顶层元素,也可在pop方法中指定元素索引,这也是一种依照index删除list元素的方法! - C++
stack
内置方法如下,注意学习掌握!