手撕算法-队列实现栈And栈实现队列
- 两个栈实现队列
- 两个队列实现栈
- 包含min函数的栈
两个栈实现队列
分析:
转换数据方向,第一个栈写,第二个栈读。
代码:
import java.util.*;
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(stack2.isEmpty()) {while(!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.pop();}
}
两个队列实现栈
分析:
先进先出,变先进后出。两个队列,
- push时,push到q1
- pop时,先将q1的元素转移到q2中,最终q1只剩一个元素,长度为1,此时即为最后push进来的,后进先出
- pop完成后,需要交换q1和q2,方便下次pop
- push操作始终在q1
代码:
public class MyStack {// 进行push操作Queue<Integer> q1 = new LinkedList<>();// 进行pop操作时,存储之前的值Queue<Integer> q2 = new LinkedList<>();public void push(int node) {q1.add(node);}public int pop() {while (q1.size() > 1) {q2.add(q1.poll());}// 交换q1和q2Queue<Integer> tmp = q1;q1 = q2;q2 = tmp;return q2.poll();}public int top(){while (q1.size() > 1) {q2.add(q1.poll());}int res = q1.peek();// 最后一个也放进去q2,然后交换q1和q2q2.add(q1.poll());// 交换q1和q2Queue<Integer> tmp = q1;q1 = q2;q2 = tmp;return res;}public boolean empty() {return q1.isEmpty() && q2.isEmpty();}public static void main(String[] args) {MyStack myStack = new MyStack();myStack.push(1);myStack.push(2);myStack.push(3);System.out.println(myStack.top());System.out.println(myStack.pop());System.out.println(myStack.pop());System.out.println(myStack.pop());System.out.println(myStack.empty());}
}
输出结果符合预期
包含min函数的栈
分析:
代码:
import java.util.*;
import java.util.Stack;public class Solution {//用于栈的push 与 popStack<Integer> s1 = new Stack<Integer>();//用于存储最小minStack<Integer> s2 = new Stack<Integer>();public void push(int node) {s1.push(node);// 空或者新元素较小,则入栈if (s2.isEmpty() || s2.peek() > node) {s2.push(node);} else {// 最小的还是原来s2的栈顶,再次入栈,表示这么多数据的最小值s2.push(s2.peek());}}public void pop() {s1.pop();s2.pop();}public int top() {return s1.peek();}public int min() {return s2.peek();}
}