Получение ошибок стека при попытке оценить выражение postfix в переполнении стека

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

Вот мой код:

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

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

-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. Но вы пытаетесь вернуть весь resultStack, который является стеком.

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

  return resultStack.top()
1

Другие решения


По вопросам рекламы [email protected]