将Stack.top()添加到Vector?

时间:2013-09-24 01:30:39

标签: c++ algorithm vector stack postfix-notation

我正在尝试实现一种算法,该算法采用令牌类型的向量(令牌在另一个.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();

}

注释掉的行是目前程序中唯一给我带来困难的部分,我想知道如何正确地将堆栈顶部插入到向量中?

1 个答案:

答案 0 :(得分:2)

此处的问题是stackvector包含不同的类型。 stack包含string,而vector包含Token。您需要从Token构建string,如下所示:

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

当然,您需要在Token中实现相应的构造函数。

此外,您不应将stack命名为与其数据类型相同。将其命名为tokenStack,以避免变量名称与编译器发生冲突。