【问题标题】:Why is my c++ code finishing with exit code 11 when using the stack?为什么我的 c++ 代码在使用堆栈时以退出代码 11 结束?
【发布时间】:2020-05-10 16:41:43
【问题描述】:
#include <iostream>
#include <stack>

int main() {
    std::string s = "()"; // Input

    std::stack<char> stack_;

    for (int i=0; i < s.length(); i++) {
        if (s[i] == stack_.top()) {
            stack_.pop();
        }
        if (s[i] == '(') {
            stack_.push(')');
        }
        if (s[i] == '{') {
            stack_.push('}');
        }
        if (s[i] == '[') {
            stack_.push(']');
        }
        else {}
    }
    while(!stack_.empty()) {
        std::cout << stack_.top() << std::endl;
        stack_.pop();
    }


    return 0;
}

我对 C++ 还很陌生,并且每天都在 LeetCode.com 上做一个问题来尝试改进。我首先在 CLion 中测试我的代码,这给了我一个“进程完成,退出代码 11”错误。我要解决的问题是:https://leetcode.com/problems/valid-parentheses/

这只是简单的测试代码,我更改了字符串 s 的输入,我的策略是将括号类型放在堆栈上,然后如果匹配的右括号是下一个字符,则将它们剥离,然后如果堆栈为空最后,字符串通过了测试。

我认为退出代码 11 是内存泄漏或分段错误错误,但我无法通过查看我的代码来找出可能发生这种情况的位置。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 我建议两件事。 1. 你看看如果你在 stack.top() 为空时调用它会发生什么。 2. 你学习如何使用你的调试器。 #2 对于软件的任何未来都是必不可少的
  • 现在可能是学习如何使用调试器的好时机。使用调试器,您可以运行程序并在发生崩溃时捕获它们。然后,调试器将允许您查看代码中发生的位置,还允许您检查相关变量的值。
  • 因为有你们的 cmets,我已经把更好地学习我的调试器作为目标。我把它推迟了 - 无法给出一个充分的理由,但你的 cmets 给了我一个很好的方向来指出自己。谢谢!

标签: c++ stack


【解决方案1】:

即使刚刚创建了stack_,也总是调用这一行:

   if (s[i] == stack_.top()) {

在空堆栈上调用 top() 会导致未定义的行为。

【讨论】:

  • 感谢您的澄清,我不知道。因为我事先创建了堆栈,所以我认为它至少会查看内存中的一些随机未初始化值,然后“if 语句”将简单地返回为 false 而没有错误。我将不得不更多地研究为什么会这样。
【解决方案2】:

std::stack::top 描述 https://en.cppreference.com/w/cpp/container/stack/top

你试图获取一个空栈顶元素的引用,所以你得到一个异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2014-01-04
    • 2017-11-03
    • 2017-01-19
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多