从中缀到后缀的表达式求值
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
问题在于您没有从堆栈中弹出值。或者至少你不使用堆栈中的值,你只弹出一次而不是两次。
相反,您从字符串中获取值,因此 op1
和 op2
的值是您使用的运算符的编码值。
您需要从堆栈中获取值:
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.0
。 op1
.
你也有同样的问题
#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
问题在于您没有从堆栈中弹出值。或者至少你不使用堆栈中的值,你只弹出一次而不是两次。
相反,您从字符串中获取值,因此 op1
和 op2
的值是您使用的运算符的编码值。
您需要从堆栈中获取值:
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.0
。 op1
.