Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查平衡分组字符时联机判断运行时错误_C++_Stack_Runtime Error - Fatal编程技术网

C++ 检查平衡分组字符时联机判断运行时错误

C++ 检查平衡分组字符时联机判断运行时错误,c++,stack,runtime-error,C++,Stack,Runtime Error,这是我用来检查分组字符字符串是否正确平衡的代码。 它在我的本地机器上运行良好,但在线法官给了我一个运行时错误 #include <iostream> #include <string> #include <stack> using namespace std; bool balanced(string exp) { stack<char> st; int i; for(i=0;i<exp.length();i++)

这是我用来检查分组字符字符串是否正确平衡的代码。 它在我的本地机器上运行良好,但在线法官给了我一个运行时错误

#include <iostream>
#include <string>
#include <stack>
using namespace std;

bool balanced(string exp)
{
    stack<char> st;
    int i;
    for(i=0;i<exp.length();i++)
    {
            if(exp[i]== '{' || exp[i]=='[' || exp[i]== '(') st.push(exp[i]);
            else if(exp[i]=='}'){
                if(st.top() == '{' && !st.empty()) st.pop();
                else return false;
            }
            else if(exp[i]==')'){
                if(st.top() == '(' && !st.empty()) st.pop();
                else return false;
            }
            else if(exp[i]==']'){
                if(st.top()=='['  && !st.empty()) st.pop();
                else return false;
            }
    }
    if(st.empty())return true;
    else return false;
}

int main() {
    string exp;int n;
    cin >> n;
    cin.ignore();
    while(n--)
    {
        getline(cin,exp);
        bool balance = balanced(exp);
        if(balance == true)cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}
在取顶部之前,应检查堆栈是否空

if(!st.empty() && st.top() == '{')
在取顶部之前,应检查堆栈是否空

if(!st.empty() && st.top() == '{')
间距

我对你的间距和括号的使用有一些问题。首先,循环中的逻辑过于缩进。一个缩进就可以了。第二,不要把逻辑写在同一行上,除非它是一个无关紧要的条件并且没有其他条件——也不要把逻辑写在同一行上。这是不可能读的。强烈倾向于自始至终使用大括号。在if后面添加一个空格

以下是采用更好间距的平衡重写:

bool balanced(string exp)
{
    stack<char> st;
    for(int i=0; i<exp.length(); i++)
    {
        if (exp[i]== '{' || exp[i]=='[' || exp[i]== '(') {
            st.push(exp[i]);
        }
        else if (exp[i]=='}') {
            if (st.top() == '{' && !st.empty()) {
                st.pop();
            }
            else {
                return false;
            }
        else if (exp[i]==')') {
            if(st.top() == '(' && !st.empty()) {
                st.pop();
            }
            else {
                return false;
            }
        }
        else if(exp[i]==']') {
            if(st.top()=='['  && !st.empty()) {
                st.pop();
            }
            else {
                return false;
            }
        }
    }

    if (st.empty()) {
        return true;
    }
    else {
        return false;
    }
}
同样,你有:

bool balanced = balanced(exp);
if (balance == true) ...
else ...
永远不要写入==true,这里甚至不需要变量:

if (balanced(exp)) {
    ...
}
else {
    ...
}
甚至可以是三元的:

cout << (balanced(exp) ? "Yes" : "No") << endl;
在这里,您只需要实现open_brace就可以做正确的事情。这样可以节省大量代码,从而减少出错的可能性。还要注意条件的重新排序-您需要首先检查非空性

论据

balanced不会修改它的参数,或者真的需要对它做任何事情,而不是迭代它。因此,请参考const:

bool balanced(std::string const& expression)
最后

使用名称空间std

间距

我对你的间距和括号的使用有一些问题。首先,循环中的逻辑过于缩进。一个缩进就可以了。第二,不要把逻辑写在同一行上,除非它是一个无关紧要的条件并且没有其他条件——也不要把逻辑写在同一行上。这是不可能读的。强烈倾向于自始至终使用大括号。在if后面添加一个空格

以下是采用更好间距的平衡重写:

bool balanced(string exp)
{
    stack<char> st;
    for(int i=0; i<exp.length(); i++)
    {
        if (exp[i]== '{' || exp[i]=='[' || exp[i]== '(') {
            st.push(exp[i]);
        }
        else if (exp[i]=='}') {
            if (st.top() == '{' && !st.empty()) {
                st.pop();
            }
            else {
                return false;
            }
        else if (exp[i]==')') {
            if(st.top() == '(' && !st.empty()) {
                st.pop();
            }
            else {
                return false;
            }
        }
        else if(exp[i]==']') {
            if(st.top()=='['  && !st.empty()) {
                st.pop();
            }
            else {
                return false;
            }
        }
    }

    if (st.empty()) {
        return true;
    }
    else {
        return false;
    }
}
同样,你有:

bool balanced = balanced(exp);
if (balance == true) ...
else ...
永远不要写入==true,这里甚至不需要变量:

if (balanced(exp)) {
    ...
}
else {
    ...
}
甚至可以是三元的:

cout << (balanced(exp) ? "Yes" : "No") << endl;
在这里,您只需要实现open_brace就可以做正确的事情。这样可以节省大量代码,从而减少出错的可能性。还要注意条件的重新排序-您需要首先检查非空性

论据

balanced不会修改它的参数,或者真的需要对它做任何事情,而不是迭代它。因此,请参考const:

bool balanced(std::string const& expression)
最后

使用名称空间std


在我的机器上工作,目的是让它在在线上工作。法官听起来很像我的代码没有按预期工作…@Mat'sMug,因为它不是编译错误,也不是错误的答案,我希望我的答案是正确的。事实上,我用20个测试用例对它进行了测试,并且工作正常。@Pradeep是否在您的计算机上正确编译和运行机器而不是在线测试仪吗?@EthanBierlein是的。是的。这让我好奇。在我的机器上工作的目的是让它在在线上工作。法官听起来很像我的代码没有按预期工作…@Mat'smugh,因为它不是编译错误,也不是错误答案,我希望我的答案是正确的。事实上,我测试了它20个测试用例,工作正常。@Pradeep是否在您的机器上正确编译和运行,而不是在线测试仪?@EthanBierlein是的。确实如此。这让我好奇。美丽。被接受。为什么顺序很重要?@Pradeep如果在尝试获取最高值时堆栈为空,则会发生未定义的行为。这是个坏消息。从表面上看,任何事情都可能发生,从返回看似随机的值,到调试实现中的崩溃bounds@Revolver_Ocelot明白了。初始化后我尝试访问堆栈顶部时发生了类似的情况。Beautiful.被接受。为什么顺序很重要?@Pradeep如果在尝试获取顶部值时堆栈为空,发生未定义的行为。这是个坏消息。从表面上看,任何事情都可能发生,从返回看似随机的值,到调试实现中的崩溃bounds@Revolver_Ocelot明白了。初始化后我试图访问栈顶时发生了类似的事情。哈,我没意识到这是从CR迁移到SO的。我认为是相反的…非常详细的审查。同时达到了错误检测和代码审查的目的。谢谢。哈,我没有意识到这是从CR迁移到SO的。我想是相反的…非常详细的审查。服务于错误检测和代码审查。谢谢。