0

トークン型のベクトル (トークンは別の .cpp ファイルで作成されます) を取り、指定された中置式を後置式に変換するアルゴリズムを実装しようとしています。

static bool isOperator(const string& token){
    return token == "+" || token == "-" || token == "*" || token == "/" || 
    token == "%";
}
static int PrecedenceOf(const string& token){
    if(token == "+" || token == "-"){return 0;}
    if(token == "*" || token == "/"){return 1;}
    throw runtime_error("Unkown operator:" + token);
}

double eval_infix_expr(vector<Token> ie, map<string,double> sym_tab)
{

vector<Token> postfix_expr;
stack <string> stack;

while(!ie.empty()){
    for(size_t i = 0; i < ie.size(); ++i){
            Token token = ie[i];
            if(!(token.type  == OPERATOR)){
                    postfix_expr.push_back(token);
            }else if(token.type == OPERATOR){
                     while (!stack.empty() && isOperator(stack.top()) &&
                                   PrecedenceOf(stack.top()) >= PrecedenceOf(token.value)){
                    //postfix_expr.push_back(stack.top()); stack.pop();
                  }
    stack.push(token.value);
            }
    }
}
Postfix_Evaluator pe(postfix_expr);
return pe.eval();

}

コメントアウトされている行は、現時点でプログラムの唯一の部分であり、問​​題を引き起こしています。スタックのトップを適切に取得してベクターに挿入するにはどうすればよいでしょうか?

4

1 に答える 1

2

ここでの問題は、stackvectorに異なる型が含まれていることです。stackが含まれていますが、stringvector含まれていますTokenToken次のように aから aを構築する必要がありますstring

postfix_expr.push_back(Token(stack.top()));

もちろん、 で実装された適切なコンストラクターが必要になりますToken

stackまた、データ型と同じ名前を付けないでください。tokenStackコンパイラとの変数名と型の競合を回避するような名前を付けます。

于 2013-09-24T01:36:12.813 に答える