1.题目
2.思路
两个队列
看见这个数据范围,可想而知,时间复杂度为O(1)几乎不可能。push操作是O(1),pop()和peek()操作都是O(n).顺着两个栈实现队列的思路试试,用两个队列来实现栈。
一个队列用来存储加入的元素,另一个队列用来辅助操作,主要考虑的是如何pop()和peek().
一开始琢磨半天发现用队列的add(), remove()好像都不能完全解决啊,后来从题目中找到了一个提示,可以使用size()函数,那么有戏了。
当开始pop()时候,把前面的n - 1个元素都放到队列2中,然后当第一个队列只剩一个元素的时候,那么remove()这个元素就是我们要弹出的元素。弹出之后,注意交换q1和q2.
当开始peek()时候,跟pop()很相似,只是不用弹出元素即可。
class MyStack {
Queue<Integer>q1 = new ArrayDeque();
Queue<Integer>q2 = new ArrayDeque();
public MyStack() {
}
int n = 0;
public void push(int x) {
q1.add(x);
// n++;
}
public int pop() {
int last = -1;
if(q1.size() == 1)last = q1.remove();
else{
while(q1.size() > 1){
int t = q1.remove();
q2.add(t);
}
last = q1.remove();
}
q1 = q2;
q2 = new ArrayDeque();
// n--;
return last;
}
public int top() {
int last = -1;
if(q1.size() == 1)last = q1.peek();
else{
while(q1.size() > 1){
int t = q1.remove();
q2.add(t);
}
last = q1.peek();
}
// q1 = q2;
// q2 = new ArrayDeque();
return last;
}
public boolean empty() {
return q1.isEmpty() && q2.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
一个队列
用一个队列的话,就要思考辅助队列的作用是什么?显示是保存不需要被弹出的元素以及找到最后一个要弹出的元素。所以直接使用一个计数器即可。
一开始每次push()一个元素,都记录长度n
然后pop()的时候,维持一个计数器temp,让队列的元素先弹出再加到末尾,直到temp == n
peek()方法类似。
class MyStack {
Queue<Integer>q1 = new ArrayDeque();
// Queue<Integer>q2 = new ArrayDeque();
public MyStack() {
}
int n = 0;
public void push(int x) {
q1.add(x);
n++;
}
public int pop() {
int last = -1;
int temp = 0;
if(q1.size() == 1)last = q1.remove();
else{
while(temp < n){
int t = q1.remove();
last = t;
temp++;
if(temp == n) break;
q1.add(t);
}
}
n--;
return last;
}
public int top() {
int last = -1;
int temp = 0;
if(q1.size() == 1)last = q1.peek();
else{
while(temp < n){
int t = q1.remove();
last = t;
temp++;
q1.add(t);
if(temp == n)break;
}
}
return last;
}
public boolean empty() {
return q1.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
3.结果