【小白刷题之路Day29】leetcode232.用栈实现队列(C++ STL stack的熟悉与使用)
- leetcode232.用栈实现队列
这道题和上一篇是姊妹篇:【小白刷题之路Day29】leetcode225. 用队列实现栈(C++ STL 队列的使用操作)
使用栈实现队列的下列操作: 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 操作)。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-queue-using-stacks 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的提交:
class MyQueue { private: stack<int> myStack1; stack<int> myStack2; public: /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { myStack1.push(x); } /** Removes the element from in front of queue and returns that element. */ int pop() { if (myStack2.empty()){ while(!myStack1.empty()){ myStack2.push(myStack1.top()); myStack1.pop(); } } int res = myStack2.top(); myStack2.pop(); return res; } /** Get the front element. */ int peek() { if (myStack2.empty()){ while(!myStack1.empty()){ myStack2.push(myStack1.top()); myStack1.pop(); } } return myStack2.top(); } /** Returns whether the queue is empty. */ bool empty() { return myStack1.empty() && myStack2.empty(); } };
思路:两个栈S1、S2,栈1用来接收元素,当需要pop时,元素转到栈2,在栈2中逆序输出即可。
输入直接push进栈1,pop时栈2不为空的话直接pop,为空的话从栈1中再倒腾点元素过来即可。
这个方案我觉得还是很简洁的。
- 总结
- 本题属于栈与队列数据结构的基本题
- 收获:对C++ STL stack的用法更熟悉了一些
- stack<int> s;
- s.push()
- s.pop() // 注意s.pop()和q.pop()一样同样不返回任何值。
- s.top()
- s.size()
- s.empty()
- stack与queue对比:
- stack.top() 独有
- queue.front() 与 queue.back()独有