两个栈实现一个队列,两个队列实现一个栈(C++实现)

Leetcode-232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

实现思路:

该类声明两个整型栈变量,pushst和popst

push数据时,直接往pushst里面入。

pop数据时,对popst栈进行判断,为空时将pushst的数据全部push到popst中,popst执行pop()操作,非空则直接popst执行pop()操作。

代码实现:

class MyQueue {

public:

    MyQueue() {

     //内置类型回调用他自己的构造函数

    }

   

    void push(int x) {

        pushst.push(x);

    }

    

    int pop() {

        if(popst.empty())

        {

            while(!pushst.empty())

            {

                popst.push(pushst.top());

                pushst.pop();

            }

        }

        int val=popst.top();

        popst.pop();

        return val;

    }

    

    int peek() {

        if(popst.empty())

        {

            while(!pushst.empty())

            {

                popst.push(pushst.top());

                pushst.pop();

            }

        }

        return popst.top();

    }

    

    bool empty() {

        return pushst.empty()&&popst.empty();

    }

private:

    stack<int> pushst;

    stack<int> popst;

};



Leetcode-

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

实现思路:

声明两个整型队列变量,q1和q2

push数据时,往非空队列push,两个都为空,任意一个入

pop数据时,将非空队列非队尾节点数据(size()>1)都入到空队列中,然后将非空队列队尾这个数据pop

代码实现:

class MyStack {

public:

    MyStack() {

    }

    

    void push(int x) {

        if(!q2.empty())

        {

            q2.push(x);

        }

        if(!q1.empty())

        {

            q1.push(x);

        }

        if(q1.empty()&&q2.empty())//两者都为空,push到q1(q2)

        {

            q1.push(x);

        }

    }

    

    int pop() {

        if(!q1.empty())

        {

            while(q1.size()>1)

            {

                q2.push(q1.front());

                q1.pop();

            }

            int front=q1.front();

            q1.pop();

            return front;

        }

        else

        {

            while(q2.size()>1)

            {

                q1.push(q2.front());

                q2.pop();

            }

            int front=q2.front();

            q2.pop();

            return front;

        }

    }

    

    //非空队列队尾数据即是所求

    int top() {

        if(!q1.empty())

        {

            return q1.back();

        }

        else

        {

            return q2.back();

        }

    }

    

    bool empty() {

        return q1.empty()&&q2.empty();

    }

private:

    queue<int> q1;

    queue<int> q2;

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值