LeetCode232:用栈实现队列

    xiaoxiao2022-07-13  146

    使用栈实现队列的下列操作:

    push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。

    示例:

    MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false

    说明:

    你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

    解析:

         这是一个栈实现对列的经典题。方法就是用两个栈是s1,s2来实现。进队时,将数据压入栈s1,出队时,判断s2是否为空,如果不为空,则返回s2栈顶元素,并弹出。如果为空,则将栈s1中的数据全部压入到s2中,然后弹出s2栈顶元素。取第一个元素的方法类似。

    代码:

    class MyQueue { public: /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { s1.push(x); } /** Removes the element from in front of queue and returns that element. */ int pop() { if(!s2.empty()) { int top = s2.top(); s2.pop(); return top; } while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } int top = s2.top(); s2.pop(); return top; } /** Get the front element. */ int peek() { if(!s2.empty()) { int top = s2.top(); return top; } while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } int top = s2.top(); return top; } /** Returns whether the queue is empty. */ bool empty() { if(s1.empty()&&s2.empty()) return true; return false; } stack<int> s1; stack<int> s2; }; /** * 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(); */

     

    最新回复(0)