尝试在c ++中计算后缀表达式时收到堆栈错误

时间:2014-08-10 10:06:53

标签: c++ stack expression postfix-notation evaluate

当我想要评估后缀表达式时,我尝试使用堆栈时遇到3个错误。我对堆栈的使用不是很有经验所以请耐心等待。

这是我的代码:

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 个答案:

答案 0 :(得分: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,这是一个堆栈。

如果您只想在堆栈顶部返回最后一个值retainint,请将该行更改为:

  return resultStack.top()