的Debug断言失败

时间:2019-05-26 21:55:00

标签: c++

如果第二秒我出错了

如果for之外的功能看起来完全一样,那么它会从优先级函数返回值,但是当我尝试执行该操作时,它表示我试图将无效参数传递给一个函数,而该函数认为致命。

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

int priority(char c);

int main()
{
stack<char>Operator;
string input;
string output;
getline(cin, input);
for (int i = 0; i < input.size(); i++)
{
    if (input[i] == '(' || input[i] == ')' || input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/')
        Operator.push(input[i]);
    else
        output.push_back(input[i]);
    if (priority(Operator.top()) == 3)
    {
        int aux = Operator.top();
        Operator.pop();
        while (priority(Operator.top() == 4))
        {
            output.push_back((char)Operator.top());
            Operator.pop();
        }
        Operator.push(aux);
    }
    if (priority(Operator.top() == 2))
    {
        Operator.pop();
        while (priority(Operator.top()) != 1)
        {
            output.push_back(Operator.top());
            Operator.pop();
        }
        Operator.pop();
    }
}
cout << output;
cin.ignore();
cin.get();
return 0;
}

int priority(char c)
{
if (c == '(')
    return 1;
if (c == ')')
    return 2;
if (c == '+' || c == '-')
    return 3;
if (c == '*' || c == '/')
    return 4;
}

1 个答案:

答案 0 :(得分:0)

正在对输入字符串中的每个符号调用语句Operator.top()。如果您的字符串以'('符号或一元加号开头,那可能会起作用,但是如果使用"2*2",会发生什么情况?

作为完美的解决方案,您应该重新设计代码以使其成为finit自动机。作为一个简单的临时解决方案,您应该检查当前符号是一个运算符还是数字,并且在后一种情况下不要调用Operator.top():

if (isdigit(input[i])) {
    output.push_back(input[i]);
}
else {
    Operator.push(input[i]);
    if (priority(Operator.top()) == 3) {
        // ...
    }
    // ...
}