题目链接

示例

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

  1. 输入:
  2. ["CQueue","appendTail","deleteHead","deleteHead"]
  3. [[],[3],[],[]]
  4. 输出:
  5. [null,null,3,-1]

解题思路

题意:
两个栈实现一个队列
实现队列的两个函数
一个是 在队列尾部插入整数
一个是 在队列头部删除整数
若队列无元素,删除操作返回-1

思路:
栈 先进后出
队列 先进先出
所以使用两个栈,一个栈维护插入,一个栈维护删除
在入列时,插入到第一个栈
在出列时,即删除时,将第一个栈内的元素全部弹出到第一个栈内,再把依次第二个栈的元素弹出

成员变量**

  • 维护两个栈 stack1stack2 ,其中 stack1 支持插入操作, stack2 支持删除操作

构造方法

  • 初始化 stack1stack2 为空

插入元素
插入元素对应方法 appendTail

  • stack1 直接插入元素

删除元素
删除元素对应方法 deleteHead

  • 如果 stack2 为空,则将 stack1 里的所有元素弹出插入到 stack2
  • 如果 stack2 仍为空,则返回 -1,否则从 stack2 弹出一个元素并返回


    使用 stack()LinkedList()
    但是 stack() 的线程安全的,所以比 LinkedList() 效率低
    LinkedList 实现了 DequeQueue 接口,可以按照队列、栈和双端队列的方式进行操作

    LinkedList 类是双向列表(底层使用链表结构)
    列表中的每个节点都包含了对前一个和后一个元素的引用。
    LinkedList有很多方法,通过这些方法可以很容易将其用作队列、栈等数据结构。
    https://blog.csdn.net/weixin_43691723/article/details/105302287

代码

  1. class CQueue {
  2. // 使用stack()
  3. //两个栈,一个出栈,一个入栈
  4. // private Stack<Integer> stack1;
  5. // private Stack<Integer> stack2;
  6. // public CQueue() {
  7. // stack1 = new Stack<>();
  8. // stack2 = new Stack<>();
  9. // }
  10. // public void appendTail(int value) {
  11. // stack1.push(value);
  12. // }
  13. // public int deleteHead() {
  14. // if(!stack2.isEmpty()){
  15. // return stack2.pop();
  16. // }else{
  17. // while(!stack1.isEmpty()){
  18. // stack2.push(stack1.pop());
  19. // }
  20. // return stack2.isEmpty() ? -1 : stack2.pop();
  21. // }
  22. // }
  23. private Deque<Integer> stack1;
  24. private Deque<Integer> stack2;
  25. public CQueue() {
  26. stack1 = new LinkedList<Integer>();
  27. stack2 = new LinkedList<Integer>();
  28. }
  29. public void appendTail(int value) {
  30. stack1.push(value);
  31. }
  32. public int deleteHead() {
  33. if(stack2.isEmpty()){
  34. while(!stack1.isEmpty()){
  35. stack2.push(stack1.pop());
  36. }
  37. }
  38. if(stack2.isEmpty()){
  39. return -1;
  40. }else{
  41. return stack2.pop();
  42. }
  43. }
  44. }
  45. /**
  46. * Your CQueue object will be instantiated and called as such:
  47. * CQueue obj = new CQueue();
  48. * obj.appendTail(value);
  49. * int param_2 = obj.deleteHead();
  50. */