2014-12-07 3 views
0

Я пытаюсь преобразовать из infix в постфикс (мне все еще нужно сделать больше), но я даже не могу продолжать работать, потому что получаю сообщение об ошибке.Может кто-нибудь помочь мне узнать, почему мое постфиксное преобразование не будет работать?

Вот где ошибка лежит:

//infix input is "1 + 2 * 3 - 4" 
//tokens = {"1", "+", "2", "*", "3", "-", "4") 
for(int i = 0; i < tokens.size(); i++) 
{ 
    if(isOperand(tokens[i])) 
     tempPostfix += tokens[i]; 
    else if(isOperator(tokens[i])) 
    { 
     if(st.empty()) 
      st.push(tokens[i]); 
     else if(getWeight(tokens[i]) > getWeight(st.top())) 
      st.push(tokens[i]); 
     else 
     { 
      while(getWeight(tokens[i]) <= getWeight(st.top()) && !st.empty()) 
      { 
       tempPostfix += st.top(); 
       st.pop(); //If there is only one item in the stack, it crashes 
      } 

      st.push(tokens[i]); 
     } 
    } 

} 
while(!st.empty()) 
{ 
    tempPostfix += st.top(); 
    st.pop(); 
} 
string postfix = tempPostfix; 
return postfix; 

Вот мои другие функции, которые я называю там

bool isOperator(string s) 
{ 
    bool r = false; 
    if(s == "+" || s == "-" || s == "*" || s == "/") 
     r = true; 

    return r; 
} 

bool isOperand(string s) 
{ 
    bool r = false; 
    if(!isOperator(s) && s != "(" && s != ")") 
     r = true; 

    return r; 
} 

int getWeight(string op) 
{ 
    int weight = 0; 
    if(op == "+" || op == "-") 
     weight = 1; 
    if(op == "*" || op == "/") 
     weight = 2; 

    return weight; 
} 

Я могу понять, все остальное, как только я понять, почему я получаю ошибка там. Заранее спасибо.

+0

Re: Теги вопроса: ** 1. ** Пожалуйста, добавьте соответствующий тег языка программирования, например. '' C++. ** 2. ** Вы уверены, что тег 'postfix' является правильным? (Из вики-страницы тега: _ «Postfix - это бесплатный широко используемый кросс-платформенный почтовый сервер с открытым исходным кодом, доступный на всех распространенных платформах». _) – stakx

ответ

0

Вы должны изменить порядок условий в вашем цикле while. Как вы сказали, есть ошибка, когда в стеке осталось только один элемент. Поэтому после того, как последний элемент в стеке выскочил, условие в цикле while снова оценивается, и вы пытаетесь выполнить операцию st.top(), когда явно не осталось больше элементов, оставшихся в стеке.

Чтобы решить эту проблему, вы можете просто просто изменить порядок условий, чтобы сначала поместить это! St.empty(). Таким образом, будет короткое замыкание, так что остальное условие не будет оценено.

+0

Удивительно, большое вам спасибо. Эта крошечная вещь была единственной ошибкой в ​​моем коде. –

 Смежные вопросы

  • Нет связанных вопросов^_^