中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间,是人们常用的算术表示方法。
后缀表达式指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。
下面简述转换方法:
1、遇到操作数,直接输出。
2、如果不是操作数,分为以下几种情况
(1)如果操作符栈为空,则入栈。
(2)如果栈非空,且当前操作符优先级大于栈顶操作符,则入栈;如果当前操作符优先级小或等于栈顶操
作符,则操作符栈出栈,直到当前操作符优先级大于栈顶操作符。
(3)如果是左括号'(',则入栈。
(4)如果是右括号')',则操作符栈一直出栈,把出栈元素放到操作数栈,直到遇到 左括号'('。
(5)特别注意左括号'('入栈时优先级等于右括号')',入栈后优先级为最小。
#include<stdio.h>
#include<string.h>
typedef struct node
{
char s[310];
int top;
}Stack;
int weight(char ch, int flag)
{
if(ch=='+'||ch=='-') return 1;
if(ch=='*'||ch=='/') return 2;
if(ch=='('&&flag==1) return 0;
if(ch=='('&&flag==0) return 3;
}
void transform(char str[])
{
Stack a;
a.top=-1;
int i,f=0,m=strlen(str);
for(i=0;i<m;i++)
{
if(str[i]>='A'&&str[i]<'Z')
{
printf("%c",str[i]);
}
else
{
if(a.top==-1)
{
a.s[++a.top]=str[i];
continue;
}
if(str[i]==')')
{
while(a.top!=-1&&a.s[a.top]!='(') // 每次进行出栈操作时都要判断栈是否为空,且判断在操作之前。
printf("%c",a.s[a.top--]);
--a.top;
continue;
}
if(weight(str[i],0)>weight(a.s[a.top],1))
{
a.s[++a.top]=str[i];
continue;
}
while(a.top!=-1&&weight(str[i],0)<=weight(a.s[a.top],1)) //每次进行出栈操作时都要判断栈是否为空,
{ //且判断在操作之前。
printf("%c",a.s[a.top]); // 用while循环为不用if语句来比较新读入的操作符与栈顶操作的的权值大小,
--a.top; // 是因为当新读入的操作符的权值小于栈顶操作符的权值时,也可能小于栈顶
f=1; // 下一 个操作符的权值
}
if(f==1)
{
a.s[++a.top]=str[i];
f=0;
}
}
}
while(a.top!=-1)
{
printf("%c",a.s[a.top--]);
}
}
int main()
{
char str[310];
gets(str);
transform(str);
return 0;
}
#include<string.h>
typedef struct node
{
char s[310];
int top;
}Stack;
int weight(char ch, int flag)
{
if(ch=='+'||ch=='-') return 1;
if(ch=='*'||ch=='/') return 2;
if(ch=='('&&flag==1) return 0;
if(ch=='('&&flag==0) return 3;
}
void transform(char str[])
{
Stack a;
a.top=-1;
int i,f=0,m=strlen(str);
for(i=0;i<m;i++)
{
if(str[i]>='A'&&str[i]<'Z')
{
printf("%c",str[i]);
}
else
{
if(a.top==-1)
{
a.s[++a.top]=str[i];
continue;
}
if(str[i]==')')
{
while(a.top!=-1&&a.s[a.top]!='(') // 每次进行出栈操作时都要判断栈是否为空,且判断在操作之前。
printf("%c",a.s[a.top--]);
--a.top;
continue;
}
if(weight(str[i],0)>weight(a.s[a.top],1))
{
a.s[++a.top]=str[i];
continue;
}
while(a.top!=-1&&weight(str[i],0)<=weight(a.s[a.top],1)) //每次进行出栈操作时都要判断栈是否为空,
{ //且判断在操作之前。
printf("%c",a.s[a.top]); // 用while循环为不用if语句来比较新读入的操作符与栈顶操作的的权值大小,
--a.top; // 是因为当新读入的操作符的权值小于栈顶操作符的权值时,也可能小于栈顶
f=1; // 下一 个操作符的权值
}
if(f==1)
{
a.s[++a.top]=str[i];
f=0;
}
}
}
while(a.top!=-1)
{
printf("%c",a.s[a.top--]);
}
}
int main()
{
char str[310];
gets(str);
transform(str);
return 0;
}