解题思路
主要在于:
新元素入栈的时候,是先放在备用队列,再将主队列的元素输出到备用队列,接在新元素后面。
使得新元素处于第一个弹出位置。
调换两个队列的元素,也就是把辅助队列的元素全部放到主队列。后续取元素和弹出元素都直接从主队列操作就可以了。
Java的话需要区别几个方法,可以避免一些异常判断
offer,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
poll,remove 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
代码
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;//备份(辅助)队列
//构造函数,初始化
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
/**
offer,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。
它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
*/
//将元素 x 压入栈顶。
public void push(int x) {
queue2.offer(x);//后进先出,先置于备用队列
//如果队列1不为空,把队列1中的元素都拿来接到队列2后面,这样x就是栈顶元素
while(!queue1.isEmpty()){
queue2.offer(queue1.poll());
}
//交换两个队列的元素,即队列2的元素放在队列1中
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
//移除并返回栈顶元素。
/**
poll,remove 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。
remove() 的行为与 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。
因此新的方法更适合容易出现异常条件的情况。
*/
public int pop() {
return queue1.poll();
}
//返回栈顶元素。
/**
peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。
与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
*/
public int top() {
return queue1.peek();
}
public boolean empty() {
if(queue1.isEmpty()){
return true;
}
return false;
}
}
/**
* 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();
*/