标签:中缀表达式变后缀表达式
2 1.000+2/4= ((1+2)*5+1)/4=
1.000 2 4 / + = 1 2 + 5 * 1 + 4 / =
先分析下中缀变后缀的思路:
得到一个中缀表达式字符串,并从头开始扫描:
A --数字时,加入后缀表达式.
B --运算符:
a. 若为 ‘(‘, 直接入栈.
b. 若为 ‘)‘, 则依次把栈中的的运算符加入后缀表达式中并出栈, 直到出现栈顶为 ‘(‘,并从栈中删除‘(‘ .
c. 若为 除括号外的其他运算符(即为 + - * /), 当其优先级高于除‘(‘以外的栈顶运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算 符优先级高和
优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。
当扫描的中缀表达式结束时,栈中的的所有运算符出栈,并加入后缀表达式.
/*代码采用数组模拟栈,变量s相当于栈顶指针*/
#include<stdio.h>
#include<string.h>
#define N 1000
int main()
{
int s,t,T,i,len;
char stack[N+1],str[N+1],ch[N+1];
scanf("%d",&T);
while(T--)
{
scanf("%s",str);//读取源数据
len=strlen(str);//求出字符串长度
s=-1;//"栈顶指针"
t=0;
/*下面根据思路开始遍历*/
for(i=0;i<len-1;i++)//减一是为了在转换过程中不对最后一位的 = 操作
{
/*首先考虑运算符,优点是在出现多位数字时可以用循环直接处理,并为满足
(相邻的操作数操作符用空格隔开)的题目要求带来方便*/
if(str[i]=='(')//若为 ' ( ' 直接入栈
{
stack[++s]=str[i];
}
else if(str[i]==')')//若为 ' ) ',依次把栈中的的运算符加入后缀表达式中,直到出现'(',并从栈中删除'('
{
while(s>=0&&stack[s]!='(')
{
ch[t++]=stack[s];
ch[t++] = ' ';
s--;
}
s--;//栈中删除出现的 (
}
/*以下分支很巧妙*/
else if(str[i]=='/'||str[i]=='*' )//若为 * 或者 /
{
/*栈顶元素为*或/ 优先级比当前运算符高或者相同,因为运算符只有+ - * / 和 () */
while(stack[s]=='/'||stack[s]=='*')
{
ch[t++]=stack[s];//栈顶元素加入后缀表达式中
ch[t++] = ' ';
s--;//退栈一次
}//循环结束时,说明栈顶元素的优先级低于当前运算符
stack[++s]=str[i];//当前运算符进栈
}
else if(str[i]=='+'||str[i]=='-')//若为 + 或者 -
{
while(s>=0&&stack[s]!='(')
{//栈中的运算符均高于或等于当前运算符,栈中运算符直接加入后缀表达式
ch[t++]=stack[s];
ch[t++] = ' ';
s--;
}
stack[++s]=str[i];
}
else{/*处理数字(包括浮点型)*/
while(str[i]<='9'&&str[i]>='0' || str[i] == '.'){
ch[t++] = str[i++];
}
ch[t++]=' ';//数字后加一个空格
i--;
}
}
while(s>=0)//栈中的运算符均加入到后缀表达式
{
ch[t++]=stack[s];
ch[t++] = ' ';
s--;
}
ch[t++]= '=';//加入未处理的 =
ch[t++]= ' ';
ch[t]='\0';//结束后缀表达式
printf("%s\n",ch);
}
return 0;
} 标签:中缀表达式变后缀表达式
原文地址:http://blog.csdn.net/u012437355/article/details/41774011