C/C++ 算法 中缀表达式转换位后缀表达式实现1
中缀(infix)表达式:即人们常用的算数逻辑表达式,其特点是操作符位于操作数的中间,如表达式:a+b*c+(d*e+f)*g。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
后缀(postfix)或者逆波兰(reverse Polish)表达式:其特点是操作符位于操作数的后面,如表达式:abc*+de*f+g*+。
#include<iostream>
#include<stack>
using namespace std;
bool isoperator(char ch);
int priority(char ch);
void infix_to_postfix(char infix[],char postfix[]);
int main(){
char infix[]="a+b*c+(d*e+f)*g";
cout<<infix<<endl;
char postfix[1024];
infix_to_postfix(infix,postfix);
cout<<postfix<<endl;
return 0;
}
bool isoperator(char ch)
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
return true;
default:
return false;
}
}
int priority(char ch)
{
switch(ch)
{
case '(':
return 0;
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return -1;
}
}
void infix_to_postfix(char infix[],char postfix[])
{
stack<char> s1;
s1.push('#');
int i=0,j=0;
while(infix[i]!='\0')
{
if(infix[i]>='a'&&infix[i]<='z')
{
postfix[j++]=infix[i];
}
else if(infix[i]=='(')
{
s1.push(infix[i]);
}
else if(infix[i]==')')
{
while(s1.top()!='(')
{
postfix[j++]=' ';
postfix[j++]=s1.top();
s1.pop();
}
s1.pop();
}
else if(isoperator(infix[i]))
{
postfix[j++]=' ';
if(s1.empty())
{
s1.push(infix[i]);
}
else
{
while(priority(infix[i])<=priority(s1.top()))
{
postfix[j++]=s1.top();
postfix[j++]=' ';
s1.pop();
}
s1.push(infix[i]);
}
}
i++;
}
while(s1.size())
{
postfix[j++]=' ';
postfix[j++]=s1.top();
s1.pop();
}
postfix[j-1]='\0';
}
运行结果: