表达式转换(中缀表达式转为后缀表达式)

习题3.11 表达式转换 (25分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。

输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +

这题主要的难点就是运算数前有正负号,昨天做的时候想多了,改了好半天都没改出来,今天一看,就有思路了。 昨天做的时候还考虑了括号和小数,其实没必要,只把这个符号输出就好了。
如果运算数前有正负号而不是运算符,那么这个数前面必定是‘(’,或者这个符号在第一位,如果这个符号是‘-’的话,就输出;如果是‘+’,就不用输出,正常的习惯正数前就没正号,别的也不用管了。

#include<stdio.h>
#include<stdlib.h>
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->t!=-1&&s->b[s->t]=='*'||s->b[s->t]=='/') {
					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->t!=-1&&s->b[s->t]!='(') {
					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;
}

用此算法实现简单计算器:Java实现简单计算器(四则运算,括号,浮点数)

相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页