代码随想录算法训练营第10天| 理论基础| 232.用栈实现队列| 225. 用队列实现栈
理论基础
了解一下 栈与队列的内部实现机智,文中是以C++为例讲解的。
文章讲解:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
232.用栈实现队列
大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);//把所以的元素先压入堆栈in里面
}
int pop() {
if(stOut.empty())//判断out堆栈里面是否有元素
{
while(!stIn.empty())//把in里面元素从后往前压入out里
{
stOut.push(stIn.top());//取出in里面的栈顶元素压入out
stIn.pop();//把in栈顶出栈
}
}
int result= stOut.top();//模仿队列的开头移除并返回元素
stOut.pop();
return result;
}
//得到前面元素
int peek() {// 返回队列开头的元素
int res=this->pop();//直接使用已有的pop函数
stOut.push(res);// 因为pop函数弹出了元素res,所以再添加回去
return res;
}
bool empty() {
return stIn.empty()&&stOut.empty();//如果队列为空,返回 true ;否则,返回 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();
*/
总结
在本题里面用堆栈来实现队列的方法,就是用两个堆栈,通过两次先进后出的性质最后解出队列的性质。
- 用队列实现栈
可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。
建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解
题目链接/文章讲解/视频讲解:https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html
class MyStack {
public:
queue<int> que1;
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int size=que1.size();
size--;//保留队列里面最后一个元素
while(size--)
{
que1.push(que1.front());//每次把最前面front元素放到队列最后
que1.pop();//队列弹出最前元素
}
int result=que1.front();//此时最前元素是原来最后元素
que1.pop();//队列弹出
return result;
}
int top() {
return que1.back();//返回栈顶元素
}
bool empty() {
return que1.empty();//boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
总结
用队列来模拟堆栈,也就是通过先进先出来实现先进后出的效果,在队列里一队元素,每次保留最后一个元素,然后把先前元素重新压入队列里,最后就可以实现此功能。