问题:测试
Implement the following operations of a queue using stacks.spa
Notes:指针
push to top
, peek/pop from top
, size
, and is empty
operations are valid.解决:code
【注】关于测试参数的解释:element
["MyQueue","push","push","peek","pop","pop","empty"] --- 表示要进行的操做it
[[],[1],[2],[],[],[],[]] --- 表示对应传入的参数io
① 使用两个栈s1,s2,进栈的时候不作任何处理,出栈的时候把栈逆序放在另一个栈,出另一个栈。
以前写常常出现空栈异常或者超时,就是没有写好s1,s2之间的转换。class
class MyQueue { // 87ms
Stack<Integer> s1 = new Stack<>();
Stack<Integer> s2 = new Stack<>();
/** Initialize your data structure here. */
public MyQueue() {}
/** Push element x to the back of queue. */
public void push(int x) {
while(! s2.isEmpty()) s1.push(s2.pop());
s1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
while(! s1.isEmpty()) s2.push(s1.pop());
return s2.pop();
}
/** Get the front element. */
public int peek() {
while(! s1.isEmpty()) s2.push(s1.pop());
return s2.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
while(! s2.isEmpty()) s1.push(s2.pop());
return s1.isEmpty();
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/object
② 使用两个栈,在进栈的时候,把栈逆序放在另一个栈,出的时候直接出另一个栈就能够了。queue
class MyQueue { //93ms
Stack<Integer> s1 = new Stack<>();
Stack<Integer> s2 = new Stack<>();
/** Initialize your data structure here. */
public MyQueue() {}
/** Push element x to the back of queue. */
public void push(int x) {
while(! s1.isEmpty()) s2.push(s1.pop());
s2.push(x);
while(! s2.isEmpty()) s1.push(s2.pop());
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
return s1.pop();
}
/** Get the front element. */
public int peek() {
return s1.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return s1.isEmpty();
}
}
③ 除了使用两个栈以外,额外使用一个指针指向头部。
class MyQueue { //113ms Stack<Integer> s1 = new Stack<>(); Stack<Integer> s2 = new Stack<>(); int head; /** Initialize your data structure here. */ public MyQueue() {} /** Push element x to the back of queue. */ public void push(int x) { if(s1.isEmpty()) head = x; s1.push(x); } /** Removes the element from in front of queue and returns that element. */ public int pop() { while(! s1.isEmpty()) s2.push(s1.pop()); int top = -1; if(! s2.isEmpty()){ top = s2.pop(); if(! s2.isEmpty()) head = s2.peek(); } while(! s2.isEmpty()) s1.push(s2.pop()); return top; } /** Get the front element. */ public int peek() { return head; } /** Returns whether the queue is empty. */ public boolean empty() { return s1.isEmpty(); } }