2014-08-10 3 views
-1

У меня возникают 3 ошибки, когда я пытаюсь использовать стеки, когда хочу оценить постфиксное выражение. Я не очень разбираюсь в использовании стеков, поэтому, пожалуйста, будьте терпеливы со мной.Получение ошибок стека при попытке оценить постфиксное выражение в C++

Вот мой код:

int Expression::evaluate(string postfix) 
{ 
    // ERROR 1 // 
    stack<int> resultStack = new stack<int>(); 

    int length = postfix.length(); 

    for (int i = 0; i < length; i++) 
    { 
     if ((postfix[i] == '+') || (postfix[i] == '-') || (postfix[i] == '*') || (postfix[i] == '/') || (postfix[i] == '^') || (postfix[i] == 'sqrt') || (postfix[i] == 'log') || (postfix[i] == 'abs') || (postfix[i] == '~')) 
     { 
      // ERROR 2 // 
      int result = doTheOperation(resultStack.pop(), resultStack.pop(), postfix[i]); 

      resultStack.push(result); 
     } 
     else if ((postfix[i] >= '0') || (postfix[i] <= '9')) 
     { 
      resultStack.push((int)(postfix[i] - '0')); 
     } 
     else 
     { 
     } 
    } 

    // ERROR 3 // 
    return resultStack; 
} 

//The operations that must be done if a specific operator is found in the string 
int Expression::doTheOperation(int left, int right, char op) 
{ 
    switch (op) 
    { 
     case '+': 
      return left + right; 
     case '-': 
      return left - right; 
     case '*': 
      return left * right; 
     case '/': 
      return left/right; 
     case '^': 
      return pow(left,right); 
     case 'sqrt': 
      if(right < 0) 
      { 
       string temp = "Square root of a negative number."; 
       throw temp; 
      } 
      else 
      { 
       return (sqrt(right)) ; 
      } 
     case 'log': 
      if (right < 0) 
      { 
       string temp = "Error. Not able to get the log of zero."; 
       throw temp; 
      } 
      else 
      { 
       int temp = log10(right); 
       return ceil(temp); 
      } 
     case 'abs': 
      if (right < 0) 
      { 
       return (right*-1); 
      } 
      else 
      { 
       return right; 
      } 
     case '~': 
      return (right*-1); 

     default: 
      return -1; 
    } 
    return -1; 
} 

Тогда это дает мне следующие ошибки:

error 1: conversion from 'std::stack<int>*' to non-scalar type 'std::stack<int>' requested 
error 2: invalid use of void expression 
error 3: cannot convert 'std::stack<int>' to 'int' in return 

Я отмечу в коде, где именно эти ошибки происходят. Я не знаю, почему я получаю эти ошибки.

+0

Просто напишите 'стека resultStack;' исправить первую ошибку. Также 'resultStack' не может быть возвращен как' int'. И последнее, но не менее важное: resultTack.pop() 'возвращает' void'. –

+0

'case 'sqrt'' является ошибкой; скорее всего, ваша система имеет 8-битные байты, поэтому char не может хранить '' sqrt''. Вам необходимо пересмотреть, как вы храните операцию. –

ответ

1

Ошибка 1:

Оператор new возвращает указатель на динамически выделенный объект (здесь std::stack<int> *) в свободном магазине, но вы просто хотите создать стек в качестве локальной переменной (std::stack<int>).

Изменение линии:

stack<int> resultStack; 

Ошибка 2:

Вы называете resultstack.pop(), конечно, ожидал, что он возвращает Int и хлопает его из стека. К сожалению, pop() недействителен. Он ничего не возвращает, поэтому вы не можете передать этот результат в качестве параметра.

Даже если он вернет int, у вас будет скрытая ошибка: у вас нет гарантии о порядке оценки параметров в вызове функции. Таким образом, вы не знаете наверняка, что из двух попсов сделано в первую очередь.

Изменение линии:

int p1 = resultStack.top(); resultStack.pop(); 
    int p2 = resultStack.top(); resultStack.pop(); 
    int result = doTheOperation(p1, p2, postfix[i]); 

Ошибка 3:

Ваша функция определяется как возвращающая Int. Но вы пытаетесь вернуть весь результатStack, который представляет собой стек.

Если вы хотите, чтобы вернуться только последнее значение remainint на вершине стека, измените строку:

return resultStack.top() 
+0

Большое вам спасибо! Похоже, это и трюк. – MFJones

+0

Убедитесь, что стек содержит элемент перед выполнением 'pop()' иначе пользователь может вызывать неопределенное поведение, предоставляя неожиданный ввод –