基础知识|表达式转换(中缀表达式转为后缀表达式)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
【基础知识|表达式转换(中缀表达式转为后缀表达式)】这题主要的难点就是运算数前有正负号,昨天做的时候想多了,改了好半天都没改出来,今天一看,就有思路了。 昨天做的时候还考虑了括号和小数,其实没必要,只把这个符号输出就好了。
如果运算数前有正负号而不是运算符,那么这个数前面必定是‘(’,或者这个符号在第一位,如果这个符号是‘-’的话,就输出;如果是‘+’,就不用输出,正常的习惯正数前就没正号,别的也不用管了。
#include
#include
struct stack{
char *b;
int t;
};
int main()
{
int n,i,j,k,f=0;
char a[100];
struct stack *s=(struct stack *)malloc(sizeof(struct stack));
s->b=(char *)malloc(sizeof(char)*20);
s->t=-1;
gets(a);
for(i=0;
a[i]!='\0';
i++){
if((a[i]=='-'||a[i]=='+')&&(i==0||a[i-1]=='(')){//运算数前有正负号
if(f!=0) printf(" ");
else f=1;
if(a[i]=='-')printf("%c",a[i]);
f=0;
//f为0后面不输出空格
}else if(a[i]>='0'&&a[i]<='9'){
if(f!=0) printf(" ");
else f=1;
while((a[i]>='0'&&a[i]<='9')||a[i]=='.'){
printf("%c",a[i]);
if((a[i+1]>='0'&&a[i+1]<='9')||a[i+1]=='.')i++;
else break;
}
}//是数字就输出,包括小数 else {
if(a[i]=='(')
s->b[++(s->t)]=a[i];
else if(a[i]=='*'||a[i]=='/'){
while(s->b[s->t]=='*'||s->b[s->t]=='/'&&s->t!=-1) {
if(f!=0) printf(" ");
else f=1;
printf("%c",s->b[(s->t)--]);
}
s->b[++(s->t)]=a[i];
}else if(a[i]==')'){
while(s->b[s->t]!='(') {if(f!=0) printf(" ");
else f=1;
printf("%c",s->b[(s->t)--]);
}
s->t--;
}else if(a[i]=='+'||a[i]=='-'){
while(s->b[s->t]!='('&&s->t!=-1) {
if(f!=0) printf(" ");
else f=1;
putchar(s->b[(s->t)--]);
}
s->b[++(s->t)]=a[i];
}
}
}
while(s->t!=-1) {
if(f!=0) printf(" ");
else f=1;
printf("%c",s->b[(s->t)--]);
}
return 0;
}
推荐阅读
- 一起来学习C语言的字符串转换函数
- 视频转换器哪种好用()
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 以太坊中的计量单位及相互转换
- 自我修养--基础知识
- 怎么将桌面上的CAD图纸添加到软件中进行BMP格式转换()
- 微信小程序基础知识
- NAT(网络地址转换技术)
- 1-Java基础知识
- Excel基础知识-打印的那些事(上)