标签:中缀表达式变后缀表达式
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