需要帮助分解后缀表达式并输出每个单独的操作。我的问题不是评估实际表达式,而是在评估之前打印每个单独的操作。
我正在使用 C++ 编写一个评估后缀表达式的程序。将采用的表达式类型为中缀表示法,并使用大写字母(AZ)和这四个操作:*、/、+ 和-。
例如:(A + B) * (F - G)
我编写了一个将中缀更改为后缀的函数:
AB+FG-*
现在我想编写一个输出每个单独操作的函数。对于上面的示例,它看起来像这样:
操作:
AB+
FG-
AB+FG-*
它需要按优先顺序输出操作。由于 A 和 B 在括号中,因此需要先完成它们,依此类推。我试图编写一个函数,该函数将后缀表达式作为输入并且不返回任何内容。该函数创建一个 char 类型的堆栈,并从头到尾遍历表达式。
如果字符是操作数,则将其压入堆栈。如果字符是运算符,则将堆栈的两个顶部值存储在 char 变量中,然后使用它们各自的运算符输出。
但是,我的函数似乎没有正确输出操作。
#include<iostream>
#include<stack>
#include <algorithm>
#include <cstdlib>
#include<string>
void operations(string exprsn) {
char op1, op2;
int len, x, j = 0;
len = exprsn.length();
stack<char>s;
string ns;
for (int i = 0; i < len; i++) {
if (exprsn[i] >= 'A' && exprsn[i] <= 'Z') {
s.push(exprsn[i]);
}
else if (isOperator(exprsn[i])) {
op1 = s.top();
s.pop();
op2 = s.top();
s.pop();
switch (exprsn[i]) {
case '+':
s.push(op2 + op1 + '+' );
cout << op2 << op1 << "+\n";
break;
case '-':
s.push(op2 + op1 + '-');
cout << op2 << op1 << "-\n";
break;
case '*':
s.push(op2 + op1 + '*');
cout << op2 << op1 << "*\n";
break;
case '/':
s.push(op2 + op1 + '/');
cout << op2 << op1 << "/\n";
break;
}
}
}
}
int main(){
string s = "AB+CD-*";
operations(s);
return 0;
}
预期输出:
AB+
光盘-
AB+CD-*
实际输出:
AB+
光盘-
«┤*
我不确定最后一行发生了什么,但我认为这与我将字符推入堆栈的方式有关。
这是另一个例子:
中缀表达式: ( A + B ) / C + ( D - E ) * F * ( G - H )
转换为后缀表示法后:
AB+C/DE-F*GH-*+
预期输出:
AB+
DE-
GH-
DE-F*
GH-*
AB+C/
AB+C/DE-F*GH-*+
实际输出:
AB+
“C/
德-
╢F*
生长激素-
&╝*
+
我知道我在某个地方犯了可怕的错误,而且我很难理解。任何帮助是极大的赞赏。谢谢你。