【问题标题】:Adding Stack.top() to a Vector?将 Stack.top() 添加到向量中?
【发布时间】:2013-09-29 01:50:25
【问题描述】:

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

}

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

【问题讨论】:

  • 用双端队列代替栈怎么样? deque 为您提供了一种一次性获取和删除项目的方法。而且,我认为您必须将字符串类型转换为令牌类型。

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


【解决方案1】:

这里的问题是stackvector 包含不同的类型。 stack 包含 string,而 vector 包含 Token。您需要从string 构造一个Token,如下所示:

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

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

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

【讨论】:

  • 如何从 stack.top() 构造一个 Token?
  • 仍然收到错误,因为 Token 无法处理转换 stack.top 我也不允许编辑我的 Token 结构,由于分配限制,我很难过...
  • 显示我创建堆栈的类型 然后更改 isOperator 和 Precedence 的输入以获得正确的输出?
  • 这似乎是一个可行的解决方案。我相信这应该可行。
  • 老实说,虽然我不知道如何使 isOperator 和 Precedence 输入正确的类型?我以前也玩过它,只得到更多的类型错误。有什么想法吗?
猜你喜欢
  • 2019-10-07
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多