问题1:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
解题思路: 栈:先进后出
利用2个栈 分别实现 一个入 一个出 第一个栈入栈的所有元素依次出栈然后入栈第二个栈 从而实现队列的先进先出
stack1.push(value) stack2.pop()
难点:stack2的出栈操作,先进行判断stack2内是否为空, 不为空直接进行stack2.pop(),为空 遍历stack1将stack1.pop()作为 stack2.push()的参数
示例 1:
输入:
[“CQueue”,”appendTail”,”deleteHead”,”deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
class CQueue {private Stack<Integer> stack1;private Stack<Integer> stack2;public CQueue() {stack1= new Stack<>();stack2 =new Stack<>();}public void appendTail(int value) {stack1.push(value);}public int deleteHead() {if(!stack2.empty()){return stack2.pop();}else{while(!stack1.empty()){stack2.push(stack1.pop());}}return stack2.empty() ? -1:stack2.pop();}}/*** Your CQueue object will be instantiated and called as such:* CQueue obj = new CQueue();* obj.appendTail(value);* int param_2 = obj.deleteHead();*/
问题2:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); —> 返回 -3.
minStack.pop();
minStack.top(); —> 返回 0.
minStack.min(); —> 返回 -2.
解题思路: 构建一个辅助栈 这个栈的顶始终是 主栈的最小值
难点:pop push操作 出现的问题:
int a=stack1.pop();//这一步不能省 因为可能会出现不执行的情况
if(a==stack2.peek())
合并: if(stack1.pop()==stack2.peek()) 导致有些出栈操作不执行
class MinStack {private Stack<Integer>stack1;private Stack<Integer>stack2;/** initialize your data structure here. */public MinStack() {stack1=new Stack<>();stack2=new Stack<>();}public void push(int x) {stack1.push(x);if(stack2.empty() || stack2.peek()>=x){stack2.push(x);}}public void pop() {int a=stack1.pop();if(a==stack2.peek())stack2.pop();}public int top() {return stack1.peek();}public int min() {return stack2.peek();}}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(x);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.min();*/
