题目:给一个中缀表达式(即标准形式的表达式),打印该表达式的后缀表达式。中缀表达式最大的不同就是去掉了表示运算符优先级的括号。操作数为26个小写或大写的英文字母(注意不包括数字和其他字符),操作符为+,-,*,/,(,),^,=,一共八个。具体见例子见下图 :
代码如下:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
/* 判断字符ch是否是一个操作数 */
bool IsOperand(char ch)
{
return (ch>='a' && ch<='z') || (ch>='A' && ch<='Z');
}
/* 返回操作数的等级 */
int GetRange(char oper)
{
switch (oper)
{
case '+':
case '-':return 0;
case '^':
case '*':
case '/':return 1;
case '(':
case '#':return -1;
}//凡是进栈的都要有等级
}
/* 把中缀转化为后缀并输出 */
void InfixToPostfix(string str)
{
cout << str << "----> ";
int len = str.size();
stack<char> s;
s.push('#');
for (int i = 0; i < len; i++)
{
if (str[i] == '=')
{
while (s.top() != '#')
{
cout << s.top();
s.pop();
}
cout << str[i];
}
else if (IsOperand(str[i]))
cout << str[i];
else
{
if (str[i] == '(')
s.push(str[i]);
else if (GetRange(str[i]) <= GetRange(s.top()))
{
while (GetRange(str[i]) <= GetRange(s.top()))
{
cout << s.top();
s.pop();
}
s.push(str[i]);
}
else if (str[i] == ')')
{
while (s.top() != '(')
{
cout << s.top();
s.pop();
}
s.pop();//删掉'('
}
else
s.push(str[i]);
}
}//for (int i = 0; i < len; i++)
while (s.top() != '#')
{
cout << s.top();
s.pop();
}
cout << endl;
}
int main()
{
string str1 = "a+b*c+(d*e+f)*g";
string str2 = "X=A+B*(C-D)/E";
string str3 = "(a*b)^a=c^d";
InfixToPostfix(str1);
InfixToPostfix(str2);
InfixToPostfix(str3);
return 0;
}
数据测试在上图。