繁体   English   中英

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

[英]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 ,然后丢弃堆栈顶部而不检查它。

例如,如果 char 是'+' (并且您的编码是 ASCII),您将拥有op2 = 43.0 您对op1有同样的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM