剑指offer每日一题第一天—— 栈与队列
前言:
刷烂力扣,刷进大厂!!!
用两个栈实现队列
题目描述:
解题思路:
代码实现:
class CQueue { // 先初始化两个栈来设计队列 public Stack<Integer> stackA; public Stack<Integer> stackB; public CQueue() { // 实例化栈 stackA = new Stack<>(); stackB = new Stack<>(); } // 队列尾部插入 public void appendTail(int value) { // 先将栈B的元素弹入栈A if(!stackB.isEmpty()) { stackA.push(stackB.pop()); } // 栈A最后加入Value stackA.push(value); } // 头部删除 public int deleteHead() { // 如果不为空,先将栈A的元素弹入栈B,此时栈B的尾部为队列的头部 while (!stackA.isEmpty()) { stackB.push(stackA.pop()); } // 先判断栈B是不是空 if(stackB.isEmpty()) { return -1; } return stackB.pop(); } }
方法二:
这个方法是借用力扣一个大佬的思路,我感觉很强! 如果你使用Stack的方式来做这道题,会造成速度较慢; 原因是Stack继承了Vector接口,而Vector底层是一个Object[]数组,那么就要考虑空间扩容和移位的问题了。 可以使用LinkedList来做Stack的容器,因为LinkedList实现了Deque接口,所以Stack能做的事LinkedList都能做,其本身结构是个双向链表,扩容消耗少。
代码实现:
class CQueue { LinkedList<Integer> stack1; LinkedList<Integer> stack2; public CQueue() { stack1 = new LinkedList<>(); stack2 = new LinkedList<>(); } public void appendTail(int value) { stack1.add(value); } public int deleteHead() { if (stack2.isEmpty()) { if (stack1.isEmpty()) return -1; while (!stack1.isEmpty()) { stack2.add(stack1.pop()); } return stack2.pop(); } else return stack2.pop(); } } /** * Your CQueue object will be instantiated and called as such: * CQueue obj = new CQueue(); * obj.appendTail(value); * int param_2 = obj.deleteHead(); */
包含min函数的栈
解题思路:
一点:借用辅助栈B,B中存储最小元素
代码实现:
class MinStack { Stack<Integer> A,B; /** initialize your data structure here. */ public MinStack() { A = new Stack<>(); B = new Stack<>(); } public void push(int x) { A.add(x); if(B.empty() || x<= B.peek()) { B.add(x); } } public void pop() { if(A.pop().equals(B.peek())) { B.pop(); } } public int top() { return A.peek(); } public int min() { return B.peek(); } }
上一篇:
Java基础知识总结(2021版)
下一篇:
阿里笔试题目:删除数的最大值