一、题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
二、思路解析
方法一、自己的笨方法
stack1的状态 | stack2的状态 | |
如果stack1为空且stack2非空时 | 如果stack2为空且stack1非空时 | |
入队 | 先入队,再将stack2倒腾过来 | 先倒腾到stack1,再入栈 |
出队 | 先倒腾到stack2中,再出栈 | 直接出栈 |
方法二、左程云大佬书里的方法
大佬的思想很精彩,stack1的用途是用来入队的,每次入队时都执行stack1入栈;而stack2是用来出队的,每次出队时都从stack2出栈,但是要注意的是如果执行出队时,stack2中没元素了,那就把stack1中的全部出栈到stack2中,再来stack2出栈,完成出队效果。
三、可以运行的java代码
方法一、自己写的代码
import java.util.Stack;
//用两个栈实现一个队列的push和pop方法
public class Solution_5 {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
if(stack1.isEmpty()&&stack2.isEmpty()){ //满足初始化条件都为空
stack1.push(node);
return;
}else if(stack1.isEmpty()&&!stack2.isEmpty()){ //先入再倒
stack1.push(node);
while (!stack2.empty()) {
stack1.push(stack2.pop());
}
}else if(stack2.isEmpty()&&!stack1.isEmpty()){ //先倒再入
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
stack2.push(node);
}
}
public int pop() {
if(stack1.isEmpty()&&!stack2.isEmpty()){ //先倒再出
while (!stack2.empty()) {
stack1.push(stack2.pop());
}
return stack1.pop();
}
return stack1.pop(); //直接出
}
public static void main(String[] args) {
Solution_5 s = new Solution_5();
//先入队五个数1,2,3,4,5
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
//再出队
while(!s.stack1.empty()||!s.stack2.empty()){
System.out.println(s.pop());
}
}
}
方法二、左程云书里的代码
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if(stack1.empty()&&stack2.empty()){
throw new RuntimeException("Queue is empty!");
}
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
四、总结
冰冻三尺非一日之寒,java程序员的内功是离不开算法修炼的,大公司招聘都要问算法的,因为可以把聪明和勤奋的人挑选出来。
此言希望可以与读者共勉!