用两个栈实现队列

LeetCode算法网站算法题

https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

费事代码:

class CQueue
{
private:
    stack<int>in;
    stack<int>out;
public:
    CQueue()
    {
        
    }
    void appendTail(int value)
    {
        in.push(value);
    }
    int deleteHead()
    {
        if(in.empty())
            return -1;
        while(!in.empty())
        {
            out.push(in.top())
            in.pop();
        }
        int ans=out.top();
        out.pop()
        while(!out.empty())
        {
            in.push(out.top());
            out.pop();
        }
        return ans;
    }
};

优化:优化的地方在于我删除一次就翻转两次栈,而优化代码删除一次反转一次,删除栈就不会在反转回加入栈,下次再删除的时候直接删删除栈的就好了,删除栈为空的时候才会翻转加入栈到删除栈中,确保正确的队列顺序。

class CQueue
{
    stack<int> stack1,stack2;
public:
    CQueue()
    {
        while (!stack1.empty())
        {
            stack1.pop();
        }
        while (!stack2.empty())
        {
            stack2.pop();
        }
    }

    void appendTail(int value)
    {
        stack1.push(value);
    }

    int deleteHead()
    {
        // 如果第二个栈为空
        if (stack2.empty())//删除栈为空说明当前删除栈中没有可删除的项,必须把加入栈反过来找栈顶删除项,否则就直接删除删除栈的栈顶元素
        {
            while (!stack1.empty())
            {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        if (stack2.empty())//如果在前面经过处理了还是为空说明队列为空
        {
            return -1;
        }
        else//队列不为空,由于第一个if语句,所以直接删除删除栈的栈顶元素
        {
            int deleteItem = stack2.top();
            stack2.pop();
            return deleteItem;
        }
    }
};

 

展开阅读全文

Windows版YOLOv4目标检测实战:训练自己的数据集

04-26
©️2020 CSDN 皮肤主题: 1024 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值