AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

AcWing 42. 栈的压入、弹出序列    原题链接    简单

作者: 作者的头像   extrovert ,  2019-01-09 06:20:53 ,  所有人可见 ,  阅读 6686


14


6

算法1

(栈) $O(n)$

用一个新栈s来模拟实时进出栈操作:

在for loop里依次喂数,每push一个数字就检查有没有能pop出来的。

如果最后s为空(或者popId==popV.size()),说明一进一出刚刚好。

时间复杂度分析:一共push n次,pop n次。

C++ 代码

class Solution {
public:
    bool isPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty() || popV.empty() || pushV.size()!=popV.size()) return false;
        stack<int> s;
        int popId=0;


        for(int pushId=0;pushId<pushV.size();++pushId){
            s.push(pushV[pushId]);
            while(!s.empty() && s.top()==popV[popId]){
                s.pop();
                ++popId;
            }
        }

        if(s.empty()) return true;
        return false;
    }
};



11 评论


用户头像
vincent0609   1个月前         踩      回复

判断可以优化一下

if (pushV.size() != popV.size()) return false;

整体代码:

class Solution {
public:
    bool isPopOrder(vector<int> pushV,vector<int> popV) {
        if (pushV.size() != popV.size()) return false;
        stack<int> stk;
        int popID = 0;

        for (int pushID = 0; pushID < pushV.size(); ++pushID) {
            stk.push(pushV[pushID]);
            while (!stk.empty() && stk.top() == popV[popID]) {
                stk.pop();
                popID++;
            }
        }
        return stk.empty();
    }
};

用户头像
快让我AC   3个月前         踩      回复

寄了吗、,代码看不懂


用户头像
Crush97   6个月前         踩      回复

class Solution {
public:
bool isPopOrder(vector[HTML_REMOVED] pushV,vector[HTML_REMOVED] popV) {
if(pushV.size() != popV.size()) return false;
if(pushV.empty() && popV.empty() ) return true;
int n = pushV.size();
int idx = 0, j = 0; //用来遍历pushV。
stack[HTML_REMOVED] s;
for (int i = 0; i < n; i )
{
s.push(pushV[i]);
while(s.top() == popV[idx])
{
s.pop();
idx
;
if(s.empty()) break;
}

    }
    if(s.empty()) return true;
    else return false;
}

};


用户头像
Bingxiu   11个月前         踩      回复

两个都空可以不用特判的,这样特判反而还要看一下两个是不是都空,如果不判断后面的跳过到了$s.empty()$依然是true


用户头像
WANGKANG   2022-11-28 18:47         踩      回复
class Solution {
   public:
    bool isPopOrder(vector<int> pushV, vector<int> popV) {
        if (pushV.size() != popV.size()) {
            return false;
        } else if (pushV.size() == 0 && popV.size() == 0) {
            return true;
        }
        stack<int> s;
        int p1 = 0, p2 = 0;
        while (p2 < popV.size()) {
            if (s.empty() || s.top() != popV[p2]) {
                do {
                    s.push(pushV[p1++]);
                } while (s.top() != popV[p2] && p1 < pushV.size());
            }
            if (!s.empty() && s.top() == popV[p2]) {
                s.pop();
                p2++;
            } else {
                return false;
            }
        }
        if (!s.empty()) {
            return false;
        } else {
            return true;
        }
    }
};

用户头像
Sommer   2022-08-12 17:27         踩      回复

我不理解啊,为什么不是逆序啊


用户头像
林天圻   2021-10-03 16:04         踩      回复

输入输出皆空时return true


用户头像
隐姓埋名学算法   2021-01-31 17:51         踩      回复

最后一句可以改成 return s.empty()


用户头像
南湾   2019-07-21 15:39         踩      回复

if(pushV.empty()&&popV.empty())
return true;
把这个放在第一行也可以


用户头像
奋斗的小小   2019-04-17 22:39         踩      回复

两个都为空,测试的时候是True。边界条件应该改成 :
if(pushV.empty() || popV.empty()) return pushV.empty() && popV.empty();
if(pushV.size()!=popV.size()) return false;

用户头像
linshan   2019-07-29 16:26         踩      回复

正解


你确定删除吗?

© 2018-2023 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息