C语言实现算法——表达式求值(中缀表达式转后缀表达式)

一、先将中缀表达式转为后缀表达式

规则:

  1. 遇到数字:直接输出
  2. 遇到左括号:直接入栈
  3. 遇到右括号:输出栈顶元素,直至遇到左括号或者栈空;右括号不入栈
  4. 遇到运算符:分两种情况:i)当前运算符优先级大于栈顶优先级,直接入栈;ii)当前运算符优先级小于栈顶,则先输出栈顶元素,直至栈空或遇到左括号,最后入栈。

举例:有中缀表达式:A+B*(C-D)-E/F,怎么转后缀表达式呢

步骤1:遇到A,输出A                             栈:空

步骤2:遇到+,入栈                                栈:+

步骤3:遇到B,输出B     累计输出:AB                                        栈:+

步骤4:遇到*,'*'的优先级大于'>',入栈   累计输出:AB              栈:*+

步骤5:遇到(,入栈   累计输出:AB                                           栈:(*+

步骤6:遇到C,输出C  累计输出:ABC                                        栈:(*+

步骤7:遇到-,入栈   累计输出:ABC                                           栈:-(*+

步骤8:遇到D,输出D 累计输出:ABCD                                      栈:-(*+

步骤9:遇到),输出栈顶,遇到(结束  累计输出:ABCD-           栈:*+

步骤10:遇到-,‘-’优先级小于栈顶‘*’,输出栈内元素,之后入栈  

累计输出:ABCD-*+                                                   栈:-

步骤11:遇到E,输出E  累计输出:ABCD-*+E          栈:-

步骤12:遇到/,‘/’优先级大于‘-’,入栈   累计输出:ABCD-*+E   栈:/-

步骤13:遇到F,输出F  累计输出:ABCD-*+EF                            栈:/-

步骤14:元素全部遍历完成,将栈元素弹出

输出:ABCD-*+EF/-

二、利用后缀表达式求解:

1.遇见数字,直接入栈

2.遇见符号

   2.1 弹出栈顶的右操作数

   2.2 弹出栈顶的左操作数

   2.3 使用当前符号进行计算,并将计算结果入栈

3.最后栈中的唯一数字就是后缀表达式的计算值

举例:已知A+B*(C-D)-E/F的后缀表达式为ABCD-*+EF/-,求该表达式的值

步骤:

1.遍历到A    栈:A

2.遍历到B   栈:BA

3..遍历到C   栈:CBA

4..遍历到D   栈:DCBA

5.遍历到-   栈顶s1=C-D  栈:s1BA

6.遍历到*  栈顶s2=B*s1 栈:s2A

7.遍历到+  栈顶s3=A+s2  栈:s3

8.遍历到E  栈:Es3

9.遍历到F  栈:FEs3

10.遍历到/   栈顶:s4=E/F   栈:s4s3

11.遍历到-    栈顶:s5=s3-s4  栈:s5

结果为s5

四、代码

#include
#include
#include
#include
typedef struct{
	int *base;
	int *top;
}stack;
void push(stack *s,int e){
	*(s->top)=e;
	(s->top)++;
}
void pop(stack *s,int *e){
	if((s->base)==(s->top)){
		e=NULL;
	}
	else{
		* e=* (--(s->top));
	}
}
int gettop(stack *s){
	return *((s->top)-1);
}
int isempty(stack *s){
	return (abs((s->base)==(s->top))); //1:isempty 0:noempty
}
int ishigh(char c1,char c2){ //c2>c1?
	if(c1=='+'||c1=='-'){
		if(c2=='+'||c2=='-'){
			return 0;
		}
		else if(c2=='*'||c2=='/'){
			return 1;
		}
	}
	if(c1=='*'||c1=='/'){
		return 0;
	}
	if(c1=='('){
		return 1;
	}
}
int calcpro(int a,int b,int ch){
	switch(ch){
		case '+':return(a+b);
		case '-':return(a-b);
		case '*':return(a*b);
		case '/':return(a/b);
	}
}
int main(){
	stack nums,calcs;
	char str[101]={0};
	char str_ch[101]={0};
	while(scanf("%s",str_ch)!=EOF){
		nums.base=(int*)malloc(100*sizeof(int));
		calcs.base=(int*)malloc(100*sizeof(int));
		nums.top=nums.base;
		calcs.top=calcs.base;
		int c1,c2,n1,n2;
		char *p;
		int  len=strlen(str_ch);
		int   i,j=0,temp=0,val=0;
		for(i=0;i

 

你可能感兴趣的:(C/C++,数据结构,中缀表达式,表达式求值,C语言,后缀表达式,栈)