如有不对,不吝赐教
进入正题:
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
这道题目是要我们把中缀表达式转换成后缀表达式,我们得先知道后缀表达式咋来的:
任何一个二元表达式a<>b(其中的<>表示一个二元运算符,a、b也为后缀表达式)都可以写为a b <>的形式,这样得到的式子就是后缀表达式。
这样以来,这不就刚好符合栈后进先出的特性了,因此我们使用栈来over这道题。
注意下括号的处理,自己动手画画就OK了。
下面上代码:
#include<stdio.h>
#include<malloc.h>
int GetLevel(char ch);
int main(void)
{
char input[30];
char sign[21];
char s[21][21];
int tail=0; //当前顺序栈的最后一个元素的位置
int pos=0; //当前顺序栈的最后一个元素的内容的位置
int top=0; //符号栈的栈顶
int i=0;
int tag=0; //表示是否处理了数字 用来对付嵌套括号
scanf("%s",input);
while(input[i]){
if(((!(input[i-1]<='9'&&input[i-1]>='0')&&')'!=input[i-1])||!i)&&('+'==input[i]||'-'==input[i])){
if('-'==input[i])
s[tail][pos++]=input[i];
i++;
} //填入数字符号
while((input[i]<='9'&&input[i]>='0')||'.'==input[i]){
s[tail][pos++]=input[i++]; //填入数字
tag=1;
}
if(tag){
s[tail][pos]='\0';
tail++;
pos=0;
tag=0;
} //表示处理了数字 那么顺序队列要往后走
if(!input[i])
break;
if(!top) //运算符号的处理
sign[top++]=input[i];
else{
if(')'==input[i]){
while('('!=sign[top-1]){
s[tail][0]=sign[top-1];
s[tail][1]='\0';
tail++;
top--;
}
top--;
}
else if('('==input[i])
sign[top++]=input[i];
else if(GetLevel(input[i])<=GetLevel(sign[top-1])&&'('!=sign[top-1]){
while(GetLevel(input[i])<=GetLevel(sign[top-1])&&'('!=sign[top-1]&&top>0){
s[tail][0]=sign[top-1];
s[tail][1]='\0';
tail++;
top--;
}
sign[top++]=input[i];
}
else
sign[top++]=input[i];
}
i++;
}
for(i=top-1;i>=0;i--){
s[tail][0]=sign[i];
s[tail][1]='\0';
tail++;
}
printf("%s",s[0]);
for(i=1;i<tail;i++){
if('('==s[i][0]||')'==s[i][0])
continue;
printf(" %s",s[i]);
}
return 0;
}
int GetLevel(char ch)
{
int level;
if('+'==ch||'-'==ch)
level=1;
else if('*'==ch||'/'==ch)
level=2;
else
level=3;
return level;
}
测试结果: