N

(Leet Code c++)Implement Queue using Stacks 본문

Leet Code 알고리즘

(Leet Code c++)Implement Queue using Stacks

naeunchan 2021. 7. 27. 10:25
728x90
반응형

232. Implement Queue using Stacks

 

Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push, peek, pop, and empty).

Implement the MyQueue class:

  • void push(int x) Pushes element x to the back of the queue.
  • int pop() Removes the element from the front of the queue and returns it.
  • int peek() Returns the element at the front of the queue.
  • boolean empty() Returns true if the queue is empty, false otherwise.

Notes:

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

Follow-up: Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.

 

Example 1:

Input ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] Output [null, null, null, 1, 1, false] Explanation MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false

 

Constraints:

  • 1 <= x <= 9
  • At most 100 calls will be made to push, pop, peek, and empty.
  • All the calls to pop and peek are valid.

스택을 이용해 큐를 구현.

 

private으로 stack과 top을 가리키는 변수를 선언한다.

 

init으로는 stk을 비워주었다.(사실 의미 없음)

 

push는 스택에 값을 넣어 주도록 한다.

만약 스택이 비어 있다면 top = x로 설정한 후, 스택에 값을 넣어준다.

 

pop은 스택에서 가장 처음에 들어간 수를 뽑아 리턴해야 한다.

그러기 위해서 임시 스택과 리턴 값을 변수로 선언하여 사용했다.

스택 사이즈가 1이 아닐 때까지 값을 빼서 임시 스택(tmp)에 저장한다.

스택에 남은 하나가 리턴 값이기 때문에 result에 저장.

만약 tmp가 비어있지 않다면 가장 마지막에 들어온 수가 peek 값이 된다.

그 후 tmp에 있는 수를 다시 스택에 저장해 큐를 유지해 주면 된다.

 

peek은 top에 저장된 수(큐에서 맨 앞에 있는 수, 스택에서 맨 처음에 들어있는 수)를 리턴하면 된다.

 

empty는 stack의 empty() 함수를 활용.

class MyQueue {
private:
    stack<int> stk;
    int top = 0;
public:
    /** Initialize your data structure here. */
    MyQueue() {
        while(!stk.empty()){
            stk.pop();
        }
    }
    
    /** Push element x to the back of queue. */
    void push(int x) {
        if(stk.empty()){
            top = x;
        }
        stk.push(x);
    }
    
    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        stack<int> tmp;
        int result = 0;
        
        while(stk.size() != 1){
            tmp.push(stk.top());
            stk.pop();
        }
        
        result = stk.top();
        stk.pop();
        
        if(!tmp.empty()){
            top = tmp.top();
        }
        
        while(!tmp.empty()){
            stk.push(tmp.top());
            tmp.pop();
        }
        
        return result;
    }
    
    /** Get the front element. */
    int peek() {
        return top;
    }
    
    /** Returns whether the queue is empty. */
    bool empty() {
        if(stk.empty()){
            return true;
        }
        else{
            return false;
        }
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */
728x90
반응형