希望帮助分解后缀表达式并输出每个单独的操作。我的问题不是评估实际表达式,而是在评估之前打印每个操作。
我正在使用C ++编写一个评估后缀表达式的程序。将采用的表达式类型为中缀符号,并使用大写字母(A-Z)和以下四个操作:*,/,+和-。
例如:(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 +
CD-
AB + CD-*
实际输出:
AB +
CD-
«┤*
我不确定最后一行是怎么回事,但我认为这与我将字符推入堆栈的方式有关。
这里是另一个示例:
前缀表达式:(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 /
DE-
╢F*
GH-
&╝*
+
我知道我在某个地方犯了严重错误,而且我很难理解。任何帮助是极大的赞赏。谢谢。
程序中的错误来自s
堆栈变量,使用类型char
而不是类型string
,这是存储多个字符所需的。
[将op2 + op1 + '+'
推入堆栈时,+
符号不会同时包含字符op2
,op1
和'+'
,因为每个变量的所有数据类型都是字符。相反,+
符号将每个字符的ascii数值相加,导致输出奇怪。
这里是代码的固定版本:
void operations(string exprsn)
{
string op1, op2;
int len, x, j = 0;
len = exprsn.length();
stack<string> s;
string ns;
for (int i = 0; i < len; i++)
{
if (exprsn[i] >= 'A' && exprsn[i] <= 'Z')
{
s.push(string(1, 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;
}