225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

    1. class MyStack {
    2. public:
    3. queue<int> que1;
    4. queue<int> que2;
    5. int size=0;
    6. MyStack() {
    7. }
    8. void push(int x) {
    9. que1.push(x);
    10. size++;
    11. }
    12. int pop() {
    13. while(size>1)
    14. {
    15. que2.push(que1.front());
    16. que1.pop();
    17. size--;
    18. }
    19. int res = que1.front();
    20. que1.pop();
    21. size--;
    22. while(!que2.empty())
    23. {
    24. que1.push(que2.front());
    25. que2.pop();
    26. size++;
    27. }
    28. return res;
    29. }
    30. int top() {
    31. return que1.back();
    32. }
    33. bool empty() {
    34. return size==0?true:false;
    35. }
    36. };

    优化

    1. class MyStack {
    2. public:
    3. queue<int> que;
    4. /** Initialize your data structure here. */
    5. MyStack() {
    6. }
    7. /** Push element x onto stack. */
    8. void push(int x) {
    9. que.push(x);
    10. }
    11. /** Removes the element on top of the stack and returns that element. */
    12. int pop() {
    13. int size = que.size();
    14. size--;
    15. while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部
    16. que.push(que.front());
    17. que.pop();
    18. }
    19. int result = que.front(); // 此时弹出的元素顺序就是栈的顺序了
    20. que.pop();
    21. return result;
    22. }
    23. /** Get the top element. */
    24. int top() {
    25. return que.back();
    26. }
    27. /** Returns whether the stack is empty. */
    28. bool empty() {
    29. return que.empty();
    30. }
    31. };