难度简单17
实现一个MyQueue类,该类用两个栈来实现一个队列。
示例:
MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false
解题思路
设置两个栈成员变量:s1,s2
s1:对应队列的添加元素操作
s2:对应队列的出列、队首操作
假设添加的元素是 1-2-3,那么对应队列 1-2-3。
具体流程是这样的:
push():s1直接调用push操作添加元素即可
peek():我们在s2中获取队首元素,也就是元素 1。那么我们先将栈s1中的元素出栈,到s2中变成3-2-1。我们只需要调用栈的top()函数得到栈顶元素 1,就是队首了。在代码中有些细节,就是先在栈s2中,判断栈是否为空,这个意思呢就是,如果之前s1出栈过,栈s2就已经有了元素。可以不用再重复s1的元素出栈到栈s2这一过程。
pop():这个跟peek()其实差不多,唯一不太一样的地方是s2要进行出栈操作。对应着队列出列(删除队首元素)操作。
提交了两次,发现自己的一个模糊点是,栈的empty()返回的是啥都忘了。返回的是true \ false。由于忘记了,我就直接加一个 ! 表示非空了。
```cpp
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 temp = s2.top();
s2.pop();
return temp;
}
while(!s1.empty())
{
int temp = s1.top();
s2.push(temp);
s1.pop();
}
int temp = s2.top();
s2.pop();
return temp;
}
/** Get the front element. */
int peek() {
if(!s2.empty() )
{
return s2.top();
}
while(!s1.empty() )
{
int temp = s1.top();
s2.push(temp);
s1.pop();
}
return s2.top();
}
/** Returns whether the queue is empty. */
bool empty() {
if(s1.empty() && s2.empty()) return true;
return false;
}
private:
stack<int> s1, 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();
*/
```