在C++中从后缀表达式字符串打印单个操作

Printing individual operations from a postfix expression string in C++

本文关键字:字符串 打印 单个 操作 表达式 后缀 C++      更新时间:2023-10-16

想要帮助分解后缀表达式并输出每个单独的操作。我的问题不是评估实际的表达式,而是在评估之前打印每个单独的操作。

我正在使用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-

«┤*

我不确定最后一行发生了什么,但我认为这与我将字符推入堆栈的方式有关。

这里是另一个例子:

Infix表达式:(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*

GH-

&╝*

+

我知道我在某个地方犯了严重的错误,我很难理解。非常感谢您的帮助。非常感谢。

程序中的错误来自使用类型char而不是类型strings堆栈变量,后者需要存储多个字符。

op2 + op1 + '+'被推送到堆栈上时,+符号不会将字符op2op1'+'连接在一起,因为每个变量的所有数据类型都是字符。相反,+符号将每个字符的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;
}