问题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]

  1. class CQueue {
  2. private Stack<Integer> stack1;
  3. private Stack<Integer> stack2;
  4. public CQueue() {
  5. stack1= new Stack<>();
  6. stack2 =new Stack<>();
  7. }
  8. public void appendTail(int value) {
  9. stack1.push(value);
  10. }
  11. public int deleteHead() {
  12. if(!stack2.empty()){
  13. return stack2.pop();
  14. }
  15. else{
  16. while(!stack1.empty()){
  17. stack2.push(stack1.pop());
  18. }
  19. }
  20. return stack2.empty() ? -1:stack2.pop();
  21. }
  22. }
  23. /**
  24. * Your CQueue object will be instantiated and called as such:
  25. * CQueue obj = new CQueue();
  26. * obj.appendTail(value);
  27. * int param_2 = obj.deleteHead();
  28. */

问题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()) 导致有些出栈操作不执行

  1. class MinStack {
  2. private Stack<Integer>stack1;
  3. private Stack<Integer>stack2;
  4. /** initialize your data structure here. */
  5. public MinStack() {
  6. stack1=new Stack<>();
  7. stack2=new Stack<>();
  8. }
  9. public void push(int x) {
  10. stack1.push(x);
  11. if(stack2.empty() || stack2.peek()>=x){
  12. stack2.push(x);
  13. }
  14. }
  15. public void pop() {
  16. int a=stack1.pop();
  17. if(a==stack2.peek())
  18. stack2.pop();
  19. }
  20. public int top() {
  21. return stack1.peek();
  22. }
  23. public int min() {
  24. return stack2.peek();
  25. }
  26. }
  27. /**
  28. * Your MinStack object will be instantiated and called as such:
  29. * MinStack obj = new MinStack();
  30. * obj.push(x);
  31. * obj.pop();
  32. * int param_3 = obj.top();
  33. * int param_4 = obj.min();
  34. */