尊敬的读者您好:笔者很高兴自己的文章能被阅读,但原创与编辑均不易,所以转载请必须注明本文出处并附上本文地址超链接以及博主博客地址:https://blog.csdn.net/vensmallzeng。若觉得本文对您有益处还请帮忙点个赞鼓励一下,笔者在此感谢每一位读者,如需联系笔者,请记下邮箱:zengzenghe@gmail.com,谢谢合作!
最近面试老被问到“2栈->队列”和“2队列->栈”的问题,为了后面不犯错误,下面就来好好总结一下。
预备知识:栈遵循“后进先出”原则,队列遵循“先进先出”原则。
一、如何用二个栈实现一个队列功能?
先用一个栈stack1去模仿队列存元素,然后通过判读另一个栈stack2是否为空,为空则将stack1中的元素依次存入stack2,最后用栈stack2去模仿队列取元素。
解题代码如下:
//两个栈实现一个队列的功能:
class Solution{
public:
//定义将数据推入队列的函数
void push(int node) {
stack1.push(node);
}
//定义将数据推出队列的函数
int pop() {
int front;
if(stack1.empty() && stack2.empty() ) return -1;
//当栈2为空且栈1不为空时,才将栈1中的元素全部倒到栈2中
if(stack2.empty())
{
while(!stack1.empty())
{
front=stack1.top();
stack1.pop();
stack2.push(front);
}
}
front = stack2.top();
stack2.pop();
return front;
}
private:
stack<int> stack1;
stack<int> stack2;
};
二、如何用二个队列实现一个栈功能?
先用一个队列queue1去模仿栈存元素,然后当需要模仿栈取元素时,将queue1中除了最后一个元素,其余均存入queue2中,最后将queue1中最后一个元素取出模仿栈取元素。
解题代码如下:
//两个队列实现一个栈的功能:
class Solution{
public:
//定义将数据推入栈的函数
void push(int node) {
queue1.push(node);
}
//定义将数据推出栈的函数
int pop() {
int top;
while(queue1.size() > 1){
top = queue1.front();
queue2.push(top);
queue1.pop();
}
if(queue1.size() == 1){
top = queue1.front();
queue1.pop();
return top;
}
while(queue2.size() > 1){
top = queue2.front();
queue1.push(top);
queue2.pop();
}
if(queue2.size() == 1){
top = queue2.front();
queue2.pop();
return top;
}
return -1;
}
private:
queue<int> queue1;
queue<int> queue2;
};
20200226
bug纠正版
class Solution{
public:
void push_fun(int val){
if(!q1.empty()&&!q2.empty())
cout<< "Your input is error"<<endl;
else if(q1.empty())
q2.push(val);
else
q1.push(val);
}
int pop_fun(){
if((q1.empty()&&q2.empty())||(!q1.empty()&&!q2.empty()))
return -1;
if(q2.empty()){
for(int i=q1.size(); i>1; i--){
int tmp = q1.front();
q1.pop();
q2.push(tmp);
}
int res = q1.front();
q1.pop();
return res;
}
else{
for(int i=q2.size(); i>1; i--){
int tmp = q2.front();
q2.pop();
q1.push(tmp);
}
int res = q2.front();
q2.pop();
return res;
}
}
private:
//两队列实现栈
queue<int> q1;
queue<int> q2;
}
日积月累,与君共进,增增小结,未完待续。