思路一:简单暴力法
push():往栈1添加元素
pop():把栈1的元素全部导入栈2,弹出并返回栈2的第一个元素,把剩下的元素倒回栈1
push时间复杂度:O(1);pop时间复杂度:O(n)
图解:push(1) => push(2) => push(3) => pop() => pop() => push(4) =>pop()
思路一简易实现:
import java.util.Stack;
public class StackToQueue {
public static void main(String[] args) {
StackToQueue stackToQueue = new StackToQueue();
stackToQueue.push(1);
stackToQueue.push(2);
stackToQueue.push(3);
System.out.println(stackToQueue.pop());
System.out.println(stackToQueue.pop());
stackToQueue.push(4);
System.out.println(stackToQueue.pop());
System.out.println(stackToQueue.pop());
}
private static Stack s1 = new Stack();
private static Stack s2 = new Stack();
public void push(Object val){
s1.push(val);
}
public Object pop(){
if(s1.empty()){
return "队列为空";
}
while (!s1.empty()){
s2.push(s1.pop());
}
Object res = s2.pop();
while (!s2.empty()){
s1.push(s2.pop());
}
return res;
}
}
思路二:添加栈和删除栈
push():往栈1添加元素
pop():把栈1视为添加栈,把栈2视为删除栈。如果栈2中有元素,直接弹出栈2元素;如果栈2没有元素,栈1有元素,把栈1的元素全部导入栈2,再弹出栈2第一个元素。
push时间复杂度:O(1);pop时间复杂度:O(1)
图解:push(1) => push(2) => push(3) => pop() => pop() => push(4) =>pop()
思路二简易实现:
import java.util.Stack;
public class StackeToQueue2 {
public static void main(String[] args) {
StackToQueue stackToQueue = new StackToQueue();
stackToQueue.push(1);
stackToQueue.push(2);
stackToQueue.push(3);
System.out.println(stackToQueue.pop());
System.out.println(stackToQueue.pop());
stackToQueue.push(4);
System.out.println(stackToQueue.pop());
System.out.println(stackToQueue.pop());
}
private static Stack s1 = new Stack();
private static Stack s2 = new Stack();
public void push(Object val) {
s1.push(val);
}
public Object pop() {
if (!s2.empty()) { //删除栈不为空直接弹出
return s2.pop();
} else if (!s1.empty()) { //删除栈为空,添加栈不为空,把元素全部导入删除栈并弹出删除栈第一个元素
while (!s1.empty()){
s2.push(s1.pop());
}
return s2.pop();
} else { //两个栈均为空
return "队列为空";
}
}
}