使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
先明确哈,栈先进后出,队列先进先出
很容易能想到用两个栈来实现这个功能,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被发展,此时就是先进先出顺序。
我自己写的题解和csnote上的题解有点差别,主要是在push这个内容上,简单来说就是我的方法比较笨,人家就很机灵了。但是最终的用时和空间还是差不多的
先说我自己的做法
public class MyQueue {
private Stack<Integer> in =new Stack();
private Stack<Integer> out =new Stack();
public MyQueue(Stack<Integer> in, Stack<Integer> out) {
this.in = in;
this.out = out;
}
public void push(int x){//每次push都要保证out栈里是空的
if(!out.empty()) {
while (!out.empty()) {
in.push(out.pop());
}
}
in.push(x);
}
public int pop(){
while (!in.empty()){
out.push(in.pop());
}
int b=out.pop();
return b;
}
public int peek(){//返回队首
while (!in.empty()){
out.push(in.pop());
}
int b=out.pop();
out.push(b);
return b;
}
public boolean empty(){
if (in.empty()&&out.empty()){
return true;
}
return false;
}
}
csNote的题解
class MyQueue {
private Stack<Integer> in = new Stack<>();
private Stack<Integer> out = new Stack<>();
public void push(int x) {
in.push(x);
}
public int pop() {
in2out();
return out.pop();
}
public int peek() {
in2out();
return out.peek();
}
private void in2out() { //和我的主要区别就是这个方法,把调整单独写成了个方法,调整的方法与我的方法也有区别,举个例子就很容易看懂
if (out.isEmpty()) {
while (!in.isEmpty()) {
out.push(in.pop());
}
}
}
public boolean empty() {
return in.isEmpty() && out.isEmpty();
}
}