2栈->队列 and 2队列->栈 by C++

尊敬的读者您好:笔者很高兴自己的文章能被阅读,但原创与编辑均不易,所以转载请必须注明本文出处并附上本文地址超链接以及博主博客地址: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;
}

日积月累,与君共进,增增小结,未完待续。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值