#include<iostream>
#include<stdio.h>
using namespace std;
#include<stack>
const int SM = 40;
int Precedence(char op){
//返回运算符op所对应的优先级数值
switch (op){
case ‘+‘:
case ‘-‘:return 1;//定义加减运算的优先级为1
case ‘*‘:
case ‘/‘:return 2;//定义乘除运算的优先级为2
default:return 0;
}
}
//将字符串s1中的中缀表达式转换为字符串s2中的后缀表达式
void Transfer(char s1[SM],char s2[SM]){
stack<char> R;//定义运用暂存运算符的栈
R.push(‘@‘);//栈底放入"@"字符,它具有最低优先级0
int i, j;//用于指示扫描s1和s2中的字符串的位置
i = 0;
j = 0;
char ch = s1[i];
while (ch != ‘@‘){
//顺序处理中缀表达式中的每个字符
if (ch == ‘ ‘){
ch = s1[++i];
}//对于空格字符不做任何处理
else if (ch == ‘(‘){
R.push(ch);
ch = s1[++i];
}//当字符为左括号,直接进栈
else if (ch == ‘)‘){
while (R.top() != ‘(‘){
s2[j++] = R.top();
R.pop();
}
R.pop();//跳出while循环后,说明此时ch为左括号,继续左括号出栈,删除栈顶的左括号
ch = s1[++i];
}//当字符为右括号,使括号内的仍停留在栈中的运算符依次出栈并写入到s2中
else if (ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘){
//对于四则运算符,使暂存在栈中的不低于ch优先级的运算符依次出栈并写入到s2中
char w = R.top();
while (Precedence(w) >= Precedence(ch)){
//Precedence()函数返回运算符形参的优先级
s2[j++] = w;
R.pop();
w = R.top();
}
R.push(ch);
ch = s1[++i];
}
else{//此处必为数字或小数点符号
while (isdigit(ch) || ch == ‘.‘){
//把一个数值中的每一位依次写入到s2串中
s2[j++] = ch;
ch = s1[++i];
}
//被转换后的每个数值后放入一个空格
s2[j++] = ‘ ‘;
}
}
//把暂存在栈中的运算符依次出栈并写入到s2串中
ch = R.top();
R.pop();
while (ch != ‘@‘){
if (ch == ‘(‘){
cerr << "expression error!" << endl;
exit(1);
}
else(s2[j++] = ch);
ch = R.top();
R.pop();
}
s2[j++] = ‘@‘;
s2[j++] = ‘\0‘;
}
void main(){
char p1[40];
char p2[40];
cout << "输入中缀表达式:";
cin >> p1;
Transfer(p1, p2);
cout << "输出后缀表达式为:" << p2 << endl;
getchar();
}
原文地址:https://www.cnblogs.com/pesuedream/p/12496801.html