轻松搞懂用栈实现队列,用队列实现栈

一:用队列实现栈

这是该题的链接:225. 用队列实现栈 - 力扣(LeetCode)

栈的特点是:先入后出,而队列的特点是先入先出。故要模拟实现出栈的特点,那么使队列的前面表示栈的后面。也就是说让栈后面进的元素,先进队列。

模拟实现步骤:

QQ录屏20230730160745

步骤1:

当栈入元素1时,队列2进元素1,此时队列1为空。判断队列1是否为空,为空则不用把队列1 的值接到队列2后面。交换队列1与队列2的值。

步骤2:

当栈再次入元素2时,队列2进元素2,此时队列1的元素为1。队列1 不为空,则把队列1的值依次接到队列2后面。接完后,交换队列1与队列2.

步骤3:

当栈再次入元素3时,队列2进元素3,此时队列1的元素为2,1。队列1 不为空,则把队列1的值依次接到队列2后面。接完后,交换队列1与队列2.、

经过这三个步骤后,栈里的数据有3,2,1(从顶到底),队列1的元素有 3,2,1。队列2为空。

这样就实现了栈的模拟。那么此时,栈的top(),也就是队列1的front()。

代码:

class MyStack {
public:
    MyStack() {

    }
    void push(int x)
    {
        q2.push(x);
        while (!q1.empty())
        {
            q2.push(q1.front());
            q1.pop();
        }
        swap(q1, q2);
    }

    int pop()
    {
        int t = q1.front();
        q1.pop();
        return t;
    }

    int top()
    {
        int r = q1.front();
        return r;
    }

    bool empty()
    {
        return q1.empty();
    }

    queue<int> q1;
    queue<int> q2;
};

二:用栈实现队列

链接:232. 用栈实现队列 - 力扣(LeetCode)

栈的特点是:先入后出,而队列的特点是先入先出。故要模拟实现出队列的特点。则要使先入队列的元素,在栈的顶部。

模拟实现步骤:

一个队列(q),两个栈(st1,st2),st1作为输入,st2作为输出。

步骤1:

q进入元素1,2,3,4。st1依次压入1,2,3,4。此时st1里面元素是4,3,2,1(从顶到底)。

步骤2:

q 去掉一个元素,变为2,3,4。则我们将st1的元素依次取出来放到st2里面去。则st1为空,st2里面的元素为1,2,3,4(从顶到底)。此时我们去掉元素1,就很简单,st2.pop()一下就好了。

步骤3:

q进入一个元素9,变为2,3,4,9。st1压入9,此时st1里面的元素只有9。而st2里面的元素有2,3,4。若q要去除一个元素,我们可以发现只需要动st2,q加入元素,我们动st1。若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。

代码:

class MyQueue {
public:
    MyQueue() {

    }

    void push(int x)
    {
        instack.push(x);
    }

    void exchange()
    {
        while (!instack.empty())
        {
            outstack.push(instack.top());
            instack.pop();
        }

    }
    int pop()
    {
        if (outstack.empty())
        {
            exchange();
        }
        int x = outstack.top();
        outstack.pop();
        return x;
    }

    int peek()
    {
        if (outstack.empty())
        {
            exchange();
            return outstack.top();
        }
        return outstack.top();

    }

    bool empty()
    {
        return instack.empty() && outstack.empty();
    }

private:
    stack<int> instack;
    stack<int> outstack;
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值