Implement Stack Using Queues Problem


Description

LeetCode Problem 225.

Implement a last-in-first-out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal stack (push, top, pop, and empty).

Implement the MyStack class:

  • void push(int x) Pushes element x to the top of the stack.
  • int pop() Removes the element on the top of the stack and returns it.
  • int top() Returns the element on the top of the stack.
  • boolean empty() Returns true if the stack is empty, false otherwise.

Notes:

  • You must use only standard operations of a queue, which means that only push to back, peek/pop from front, size and is empty operations are valid.
  • Depending on your language, the queue may not be supported natively. You may simulate a queue using a list or deque (double-ended queue) as long as you use only a queue’s standard operations.

Example 1:

1
2
3
4
5
6
7
8
9
10
11
12
Input
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
Output
[null, null, null, 2, 2, false]
Explanation
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // return 2
myStack.pop(); // return 2
myStack.empty(); // return False

Constraints:

  • 1 <= x <= 9
  • At most 100 calls will be made to push, pop, top, and empty.
  • All the calls to pop and top are valid. Follow-up: Can you implement the stack using only one queue?


Sample C++ Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class MyStack {
public:
    queue<int> q1, q2;
    
    /** Initialize your data structure here. */
    MyStack() {
        
    }
    
    /** Push element x onto stack. */
    void push(int x) {
        q1.push(x);    
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int ele = 0;
        int cnt = 0;
        while (!q1.empty()) {
            ele = q1.front();
            q2.push(ele);
            q1.pop();
            cnt ++;
        }
        while (!q2.empty()) {
            if (cnt > 1) {
                q1.push(q2.front());
                q2.pop();
                cnt --;
            } else {
                q2.pop();
            }
        }
        return ele;
    }
    
    /** Get the top element. */
    int top() {
        int ele = 0;
        while (!q1.empty()) {
            ele = q1.front();
            q2.push(ele);
            q1.pop();
        }
        while (!q2.empty()) {
            q1.push(q2.front());
            q2.pop();
        }
        return ele;
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return (q1.empty());
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */




Related Posts

Implement Stack Using Queues Problem

LeetCode 225. Implement a last-in-first-out (LIFO) stack using only two...