Добавление Stack.top() в вектор?

Я пытаюсь реализовать алгоритм, который принимает вектор типа 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();

}

Закомментированная строка - единственная часть программы, которая на данный момент вызывает у меня затруднения, мне интересно, как мне правильно взять вершину стека и вставить ее в вектор?


person user2757849    schedule 24.09.2013    source источник
comment
Как насчет использования дека вместо стека? deque дает вам возможность получить и удалить элемент за один шаг. И я думаю, вам нужно преобразовать тип строки в тип токена.   -  person Kyokook Hwang    schedule 24.09.2013


Ответы (1)


Проблема здесь в том, что stack и vector содержат разные типы. stack содержит string, а vector содержит Token. Вам нужно будет построить Token из string как в:

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

Конечно, вам понадобится соответствующий конструктор, реализованный в Token.

Также вы не должны называть свой stack так же, как его тип данных. Назовите его что-нибудь вроде tokenStack, чтобы избежать конфликтов имени и типа переменной с компилятором.

person pippin1289    schedule 24.09.2013
comment
Как создать токен из stack.top()? - person user2757849; 24.09.2013
comment
Все еще получаю сообщение об ошибке, потому что Token не может обрабатывать преобразование stack.top. Мне также не разрешено редактировать структуру Token из-за ограничений назначения, я в тупике... - person user2757849; 24.09.2013
comment
Показать, что я делаю тип стека ‹Token›, затем меняю входные данные isOperator и Precedence, чтобы получить правильные выходные данные? - person user2757849; 24.09.2013
comment
Это кажется жизнеспособным решением. Я считаю, что это должно сработать. - person pippin1289; 24.09.2013
comment
Я буду честен, хотя я понятия не имею, как сделать ввод isOperator и Precedence правильным типом? Я дурачился с этим раньше и получил только больше ошибок типа. Любые идеи? - person user2757849; 24.09.2013
comment
Мне нужно было бы увидеть класс Token, чтобы сделать обоснованное предположение. Я предполагаю, что вы можете каким-то образом получить доступ к строке, хранящейся в токене, поэтому, когда вы передаете токен одной из этих функций, получите доступ к внутренней строке для сравнения со строковыми литералами. Возможно, также потребуется больше вопросов SO :) - person pippin1289; 24.09.2013