问题描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
在完成本题之前,首先需要明确栈和队列
的机制。
栈:LIFO(last in first out)先入后出
。队列:FIFO(first in first out)先入先出
。
解题思路描述:
一个先进先出,一个先进后出。顺序刚好相反。(这里以栈1,栈2,队列来描述三者的关系。)
- 1,因此当push时,可以将栈1作为push的保存结构,来临时保存push的数据。
- 2,当pop时,这里可以将栈1的数据全部倒入栈2里面,刚好可以把顺序反转过来,达到先入先出的效果。
- 3,当然这里也会出现问题,比如,你先push了
1,2,3
进入栈1中,栈1此刻数据顺序为栈1(3,2,1)
;当pop时,先将栈1的数据全部转到了栈2,此刻为栈1(null),栈2(1,2,3)
,pop出去2个变为栈2(3)
。如果这时再push一个4,先push到栈1中,栈1变为(4)
;再pop,此刻栈1(4)
将数据pop到栈2中变为栈1(null)
,而栈2变为(4,3)
,pop出去的将会是4,不符合要求,因此需要在前面加上判断,判断栈2是否为空,如果不为空,pop的应该是栈2中的元素,如果为空才将栈1的转移到栈2再pop。
代码:
class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
//先将push到队列的元素加入栈1中
stack1.push(node);
}
public int pop() {
if(!stack2.empty()){
//检查栈2中是否还有元素,如果有就直接从栈2中取出
return stack2.pop();
}else {
//如果栈2为空,就从栈1将数据倒入栈2,达到顺序的效果
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}