正如标题所述,你需要使用两个栈来实现队列的一些操作。
队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。
pop和top方法都应该返回第一个元素的值。
思路:这里有一个老哥的讨论感觉很有趣也很有用
我开始是考虑到了将一个用来导入,一个用来缓存,但是效率太低。不过,看到他的讨论的最后一个方案确实很不错,利用队列先进先出的性质,具体的就不转载了,链接里很详细。
Python3
class MyQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, element):
# write your code here
self.stack1.append(element)
def top(self):
# write your code here
# return the top element
if self.stack2:
return self.stack2[-1]
else:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2[-1]
def pop(self):
# write your code here
# pop and return the top element
if self.stack2:
return self.stack2.pop()
else:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
在写这段代码的过程中犯了一个小错误导致memory limitation exceeding。
stack1.pop stack1.pop()
Java
public class MyQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public MyQueue() {
// do initialization if necessary
stack1 = new Stack<Integer>();
stack2 = new Stack<Integer>();
}
public void push(int element) {
// write your code here
stack1.push(element);
}
public int pop() {
// write your code here
if (!stack2.empty())
{
return stack2.pop();
}
while(!stack1.empty())
{
int x = stack1.pop();
stack2.push(x);
}
return stack2.pop();
}
public int top() {
// write your code here
if (!stack2.empty())
{
return stack2.peek();
}
while(!stack1.empty())
{
int x = stack1.pop();
stack2.push(x);
}
return stack2.peek();
}
}
在编写中遇到一些问题:
- int 与 integer的相等问题
经过查阅,int 是一个数据类型,初值0; integer是一个int的包装类,初值null。但是在对比时,integer会拆箱和int对比,所以int == integer,只要值相等,就会相等。
除此之外,两个新建的integer是不相等的(比较的是地址)。非新建的integer在-128-127之间,只要值相等就==(引用),但是如果不在这之间,就算值等他们也不==,因为他们会单独建立对象,互不引用。
More - 调用所有的函数还是建立新的对象,都会有()。