从中缀到后缀的表达式求值

Expression evaluation from infix to postfix

#include <iostream>
#include <string>
#include <stack>
using namespace std;
float postix_evalute(string expr)
{
    stack<float> stk;
    float val;
    for (int x = 0; x < expr.length(); x++)
    {
        if (isdigit(expr[x]))
        {
            stk.push((expr[x] - '0'));
        }
        else
        {
            float op2 = expr[x];
            stk.pop();
            float op1 = expr[x];
            stk.top();
            switch (expr[x])
            {
            case '+':
                val = op1 + op2;
                break;
            case '-':
                val = op1 - op2;
                break;
            case '*':
                val = op1 * op2;
                break;
            case '/':
                val = op1 / op2;
                break;
            }
            stk.push(val);
        }
    }
    return stk.top();
}
int main()
{
    string line;
    cout << "The Value Of experssion" << endl;
    cin >> line;
    cout << postix_evalute(line) << endl;
    return 0;
}

当我尝试 运行 时,此代码用于获取用户输入的字符串的后缀赋值 运行 此代码给我随机值,但没有给我正确答案,所以我想知道问题出在哪里例如当我输入 32+ 它给我 86

问题在于您没有从堆栈中弹出值。或者至少你不使用堆栈中的值,你只弹出一次而不是两次。

相反,您从字符串中获取值,因此 op1op2 的值是您使用的运算符的编码值。

您需要从堆栈中获取值:

float op2 = stk.top();
stk.pop();
float op1 = stk.top();
stk.pop();
        if (isdigit(expr[x]))
        {
            stk.push((expr[x] - '0'));
        }

您正在一次推动一个数字。如果你运行postfix_evaluate("32"),这个循环会先把3压入栈,然后2。您确定不想将单个值 32 放在堆栈上吗?

在不稳定的基础上编写大量代码之前,您可以而且应该调试这些基本内容。

            float op2 = expr[x];
            stk.pop();

这些行从字符串中复制一个字符(我们刚刚决定不是一个数字),将其提升为float,然后丢弃堆栈的顶部而不检查它。

例如,如果字符是 '+'(并且您的编码是 ASCII),您将得到 op2 = 43.0op1.

你也有同样的问题