题目简述:用两个栈实现队列
题目链接
我的思路:
初始化两个栈s1,s2
push操作:将元素压入栈1。
pop操作:先将栈1的所有数据压入栈2,再从栈2进行pop,之后再将栈2的数据压回栈1。
peek操作:与pop操作类似,先将栈1的所有数据压入栈2,再读取栈2顶的元素,之后再将栈2的数据压回栈1。
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() {
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
int val = s2.top();
s2.pop();
while(!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
return val;
}
/** Get the front element. */
int peek() {
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
auto val = s2.top();
while(!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
return val;
}
/** Returns whether the queue is empty. */
bool empty() {
if(s1.empty())
return true;
else
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();
*/
但其实大可不必每次执行完pop和peek操作后再把栈2的数据全部又压回栈1,而是每次要执行pop和peek操作之前先判断栈2是否为空,如果为空则把栈1的所有数据压入栈2,否则直接对栈2进行相关操作即可!!!
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
/** Initialize your data structure here. */
MyQueue() {
}
/** Push element x to the back of queue. */
void push(int x) {
stIn.push(x);
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
// 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
if (stOut.empty()) {
// 从stIn导入数据直到stIn为空
while(!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
/** Get the front element. */
int peek() {
int res = this->pop(); // 直接使用已有的pop函数
stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
return res;
}
/** Returns whether the queue is empty. */
bool empty() {
return stIn.empty() && stOut.empty();
}
};
上述代码来源于公众号:代码随想录
其中peek实现方式也很巧妙:直接利用了已经实现好的pop操作!