剑指offer——栈与队列之间的相互实现

题目描述1:

用两个栈来实现一个队列,完成队列的Push和Pop操作。在线编程见用两个栈实现队列

分析:队列的特点是“先进先出”,而栈的特点是“先进后出”。始终维护s1作为存储空间,以s2作为临时缓冲区。入队时,将元素压入s1。出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。具体分析见下图:


代码如下:

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        int ans;
        if(stack2.empty())
        {
            while(!stack1.empty())
            {
                stack2.push(stack1.top());
        		stack1.pop();
            }
        }
        ans = stack2.top();
        stack2.pop();
        return ans;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

题目描述2:

用两个队列来实现一个栈,完成栈的Push和Pop操作。

分析:假设有两个队列Q1和Q2,当二者都为空时,入栈操作可以用入队操作来模拟,可以随便选一个空队列,假设选Q1进行入栈操作,现在假设a,b,c依次入栈了(即依次进入队列Q1),这时如果想模拟出栈操作,则需要将c出栈,因为在栈顶,这时候可以考虑用空队列Q2,将a,b依次从Q1中出队,而后进入队列Q2,将Q1的最后一个元素c出队即可,此时Q1变为了空队列,Q2中有两个元素,队头元素为a,队尾元素为b,接下来如果再执行入栈操作,则需要将元素进入到Q1和Q2中的非空队列,即进入Q2队列,出栈的话,就跟前面的一样,将Q2除最后一个元素外全部出队,并依次进入队列Q1,再将Q2的最后一个元素出队即可。

/* 
用两个队列模拟入栈操作 
*/  
void push(PQUEUE pS1,PQUEUE pS2,int val)  
{  
    if(is_empty(pS2))  
        en_queue(pS1, val);  
    else  
        en_queue(pS2, val);  
}  
  
/* 
用两个队列模拟出栈操作 
*/  
bool pop(PQUEUE pS1,PQUEUE pS2,int *pData)  
{  
    if(is_empty(pS1) && is_empty(pS2))  
        return false;  
  
    int DelData;  
    if(!is_empty(pS2))  
    {  
        int len = length(pS2);  
        while(len-- > 1)  
        {  
            de_queue(pS2,&DelData);  
            en_queue(pS1,DelData);  
        }  
        //将队列的最后一个元素出队,作为出栈元素  
        de_queue(pS2,pData);  
        return true;  
    }  
    if(!is_empty(pS1))  
    {  
        int len = length(pS1);  
        while(len-- > 1)  
        {  
            de_queue(pS1,&DelData);  
            en_queue(pS2,DelData);  
        }  
        //将队列的最后一个元素出队,作为出栈元素  
        de_queue(pS1,pData);  
        return true;  
    }  
}  

参考资料:

用两个栈实现队列

【剑指offer】两个队列实现一个栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值