验证和中缀表达

时间:2013-09-24 20:41:22

标签: c++ algorithm function validation infix-notation

我必须编写一个方法来验证来自用户输入的给定中缀表达式,该表达式将位于Vector中。

我已经运行了一部分方法来平衡开始和结束分隔符,现在我正在添加一个帮助方法来检查表达式的语法,例如以下情况是程序运行时发生的情况,包括错误:

validate (4+5) 
returns true
validate (45+)
returns false
validate 45+ 
Vector out of range. 

我认为这是因为我调用v.at(i+1).type而发生的,但是,如果我的false添加if语句以返回int i = v.size() && tt.type == OPERATOR,则检查最后一个令牌的情况是一个运算符,它仍然给出了相同的向量超出范围的错误。

有关此错误发生原因的任何输入?

bool isValArith(vector<Token> v){

    bool lol;
    Token tt;
    stack<Token> st;
    for (int i = 0; i < v.size(); i++){
        tt= v.at(i);
        if (tt.type != OPERATOR && tt.value != "[" && tt.value != "(" && 
                tt.value != "{" &&  tt.value != "}" && tt.value != ")" && 
                tt.value != "]"){
                st.push(tt);
        }

        if (tt.type == OPERATOR){
            if (st.top().type != OPERATOR && v.at(i+1).type != OPERATOR && 
                v.at(i+1).value != "[" && v.at(i+1).value != "{" && 
                v.at(i+1).value != "(" && v.at(i+1).value != "}" &&  
                v.at(i+1).value != "]" && v.at(i+1).value != ")"){
                lol = true;
                cout << "here" << endl;
            }
            else {
                cout << "Error: Invalid Expression" << endl;
                lol = false;
            }
        }
    }
    return lol;
}

1 个答案:

答案 0 :(得分:3)

当您尝试处理OPERATOR时,您会在令牌向量中向前看1个元素。您需要做的是检查以确保不引用令牌向量的末尾。添加一个明确的检查,如:

if (i+1 >= v.size()) {
// code to handle final token being an operator
}

在检查下一个标记的if语句之前。