剑指offer 用两个栈来实现一个队列(C++)

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

算法描述

这道题目在考研数据结构的时候也做过,用两个栈来实现队列进队、出队的功能是可以实现的。
1、栈(stack)是先进后出(FILO)的数据结构,队列(queue)是先进先出(FIFO)的数据结构,它们都是操作受限的数据结构。
2、在C++语言的容器(STL)中,存在栈容器和队列容器,压栈出栈,进队出队的操作分别是 s t a c k . p u s h ( ) , s t a c k . p o p ( ) ; q u e u e . p u s h ( ) , q u e u e . p o p ( ) stack.push(),stack.pop();queue.push(),queue.pop() stack.push()stack.pop()queue.push()queue.pop().
取栈顶元素是 s t a c k . t o p ( ) stack.top() stack.top().
3、在用两个栈实现队列功能时,可用第一个栈模拟进队,第二个栈模拟出队,从第一个栈进栈的元素,依次压入第二个栈,先进入栈中的元素到第二个栈中位置全部反了过来,出队操作的时候就可以执行第二个栈的出栈操作就相当于实现了先进先出的情况,实现了出队操作。
4、如果有新的元素进栈,且第二个栈中还有元素时,例如: a , b , c , d a,b,c,d a,b,c,d元素依次入栈,然后再次出栈进入第二个栈中,此时第二个栈中从上到下元素依次为 a , b , c , d a,b,c,d a,b,c,d,如果 a , b a,b a,b出队,此时栈中还有 c , d c,d c,d元素,当元素 e e e入栈时,马上进入第二个栈就会出现 a , b a,b a,b出队后下一个出队的是 e e e,此时出现错误。所以,只有当第二个栈中的元素全部出栈的时候,才可以将第一个栈中的元素出栈压入第二个栈中。

代码实现

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

    int pop() {
        if(stack2.empty()) // 如果栈空 才能执行入栈操作
        {
            while(!stack1.empty()) //如果栈1中存在元素
            {
                stack2.push(stack1.top()); // 取栈1中栈顶元素压入栈2中
                stack1.pop(); // 栈1元素出栈
            }
        }
        int top = stack2.top(); // 取栈顶元素 用于出队操作
        stack2.pop(); // 出队后 出栈
        return top; // 返回出队元素
    }

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

代码注解

s t a c k . e m p t y ( ) stack.empty() stack.empty():栈的判空,空栈返回1,不空返回0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值