从 C++ 中的后缀表达式字符串打印单个操作
Printing individual operations from a postfix expression string in C++
需要帮助分解后缀表达式并输出每个单独的操作。我的问题不是评估实际表达式,而是在评估之前打印每个单独的操作。
我正在使用 C++ 编写一个计算后缀表达式的程序。取入的表达式类型为中缀表示法,使用大写字母(A-Z)和这四种运算:*、/、+、-。
这方面的一个例子是:
(A + B) * (F - G)
我写了一个将中缀更改为后缀的函数:
AB+FG-*
现在我想写一个函数来输出每个单独的操作。对于上面的示例,它看起来像这样:
操作:
AB+
FG-
AB+FG-*
需要按优先顺序输出操作。由于 A 和 B 在括号中,因此需要先完成它们,依此类推。
我试图编写一个将后缀表达式作为输入并且 returns 什么都没有的函数。该函数创建一个 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;
}
需要帮助分解后缀表达式并输出每个单独的操作。我的问题不是评估实际表达式,而是在评估之前打印每个单独的操作。
我正在使用 C++ 编写一个计算后缀表达式的程序。取入的表达式类型为中缀表示法,使用大写字母(A-Z)和这四种运算:*、/、+、-。
这方面的一个例子是: (A + B) * (F - G)
我写了一个将中缀更改为后缀的函数:
AB+FG-*
现在我想写一个函数来输出每个单独的操作。对于上面的示例,它看起来像这样:
操作:
AB+
FG-
AB+FG-*
需要按优先顺序输出操作。由于 A 和 B 在括号中,因此需要先完成它们,依此类推。 我试图编写一个将后缀表达式作为输入并且 returns 什么都没有的函数。该函数创建一个 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;
}