表达式求值

判断c是否是运算符 是返回1,否则返回0

int isOp(char c)//判断c是否是运算符 是返回1,否则返回0 
{
	switch(c)
	{
		case '+':
		case '-':
		case '*':
		case '/':
		case '(':
		case ')':
		case '#': return 1;
	}
	return 0;
} 

 计算a op b的值并返回 

int twoResult(int a,char op,int b)//计算a op b的值并返回 
{
	int c;
	switch(op)
	{
		case '+':c=a+b;break;
		case '-':c=a-b;break;
		case '*':c=a*b;break;
		case '/':c=a/b;break;	
	}
	return c;
}

比较栈内c1 栈外c2 的优先级 ,返回“>  =  <”

char compare(char c1,char c2)//比较栈内c1 栈外c2 的优先级 ,返回“>  =  <”
{
	int t1,t2;
	switch(c1)
	{
		case '+':
		case '-':t1 = 2;break;
		case '*':
		case '/':t1 = 4;break;
		case '(':t1 = 0;break;
		case '#':t1 = -1;break;
	}
	switch(c2)
	{
		case '+':
		case '-':t2 = 1;break;
		case '*':
		case '/':t2 = 3;break;
		case '(':t2 = 5;break;
		case ')':t2 = 0;break;
		case '#':t2 = -1;break;
	}
	if(t1>t2) return '>';
	else if(t1==t2) return '=';
	else return '<';
} 

中缀表达式exp转化成后缀表达式,并返回 后缀表达式 

char *change(char exp[])//中缀表达式exp转化成后缀表达式,并返回 后缀表达式 
{
	int i=0,j=0;
	char *str=(char *)malloc(sizeof(char)*100);
	StackNode *s=InitStack();
	push(s,'#');//这里是字符,不是字符串 
	strcat(exp,"#");//因为是字符串,所以要加双引号 
	while(GetTop(s)!='#'||exp[i]!='#')
	{
		if(exp[i]>='0'&&exp[i]<='9')
		{
			str[j++]=exp[i++];
			if(exp[i]<'0'||exp[i]>'9')
			{
				str[j++]=' ';
			}
		}
		else if(isOp(exp[i]))
		{
			ElemType x;//存放出栈的元素 
			switch(compare(GetTop(s),exp[i]))
			{
				case '>':pop(s,&x);str[j++]=x;str[j++]=' ';break;
				case '=':pop(s,&x);i ++;break;
				case '<':push(s,exp[i++]);break;
			}
		}
		else i ++;
	}
	str[j]=0;//\0的ASCII就是0
	return str; 
}

中缀表达式求值

int express(char exp[])//中缀表达式求值
{
	int i = 0;
	char *str=change(exp);
	int r;
	StackNode *s=InitStack();
	while(str[i]!=0)
	{
		if(str[i]>='0'&&str[i]<='9')
		{
			int x=0;
			while(str[i]>='0'&&str[i]<='9')
			    x=x*10+str[i++]-'0';
			push(s,x);  
		}
		else if(isOp(str[i]))
		{
			int a,b;
			pop(s,&b);pop(s,&a);
			push(s,twoResult(a,str[i++],b));
		}
		else i ++;
	}
	pop(s,&r);
	return r;
} 

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ElemType;
typedef struct stacknode
{
	ElemType data;
	struct stacknode *next;
}StackNode;
StackNode *InitStack()//初始化空的链栈
{
	StackNode *s=(StackNode*)malloc(sizeof(StackNode));
	s->next=NULL;
	return s;
}
int push(StackNode *s,ElemType x)//入栈
{
	StackNode *p=(StackNode*)malloc(sizeof(StackNode));
	p->data=x;
	p->next=s->next;
	s->next=p;
	return 1;
} 
int pop(StackNode *s,ElemType *x)//出栈 
{
	StackNode *p;
	if(s->next==NULL)
	return 0;
	p=s->next;
	s->next=p->next;
	*x=p->data;
	free(p);
	return 1;
}
ElemType GetTop(StackNode *s)//获得栈顶元素 
{
	return s->next->data;
}
int Palindrome(char str[],int n)
{
	StackNode *s=InitStack();
	int i = 0;
	while(i<n/2)
	{
		push(s,str[i++]);
	}
	if(n%2)
	i ++;//奇数的情况
	while(str[i]!='\0')
	{
		ElemType x;
		pop(s,&x);
		if(x!=str[i])
		    return 0;
		i ++;
	}
	return 1;
} 

int isOp(char c)//判断c是否是运算符 是返回1,否则返回0 
{
	switch(c)
	{
		case '+':
		case '-':
		case '*':
		case '/':
		case '(':
		case ')':
		case '#': return 1;
	}
	return 0;
} 

int twoResult(int a,char op,int b)//计算a op b的值并返回 
{
	int c;
	switch(op)
	{
		case '+':c=a+b;break;
		case '-':c=a-b;break;
		case '*':c=a*b;break;
		case '/':c=a/b;break;	
	}
	return c;
}

char compare(char c1,char c2)//比较栈内c1 栈外c2 的优先级 ,返回“>  =  <”
{
	int t1,t2;
	switch(c1)
	{
		case '+':
		case '-':t1 = 2;break;
		case '*':
		case '/':t1 = 4;break;
		case '(':t1 = 0;break;
		case '#':t1 = -1;break;
	}
	switch(c2)
	{
		case '+':
		case '-':t2 = 1;break;
		case '*':
		case '/':t2 = 3;break;
		case '(':t2 = 5;break;
		case ')':t2 = 0;break;
		case '#':t2 = -1;break;
	}
	if(t1>t2) return '>';
	else if(t1==t2) return '=';
	else return '<';
} 

char *change(char exp[])//中缀表达式exp转化成后缀表达式,并返回 后缀表达式 
{
	int i=0,j=0;
	char *str=(char *)malloc(sizeof(char)*100);
	StackNode *s=InitStack();
	push(s,'#');//这里是字符,不是字符串 
	strcat(exp,"#");//因为是字符串,所以要加双引号 
	while(GetTop(s)!='#'||exp[i]!='#')
	{
		if(exp[i]>='0'&&exp[i]<='9')
		{
			str[j++]=exp[i++];
			if(exp[i]<'0'||exp[i]>'9')
			{
				str[j++]=' ';
			}
		}
		else if(isOp(exp[i]))
		{
			ElemType x;//存放出栈的元素 
			switch(compare(GetTop(s),exp[i]))
			{
				case '>':pop(s,&x);str[j++]=x;str[j++]=' ';break;
				case '=':pop(s,&x);i ++;break;
				case '<':push(s,exp[i++]);break;
			}
		}
		else i ++;
	}
	str[j]=0;//\0的ASCII就是0
	return str; 
}

int express(char exp[])//中缀表达式求值
{
	int i = 0;
	char *str=change(exp);
	int r;
	StackNode *s=InitStack();
	while(str[i]!=0)
	{
		if(str[i]>='0'&&str[i]<='9')
		{
			int x=0;
			while(str[i]>='0'&&str[i]<='9')
			    x=x*10+str[i++]-'0';
			push(s,x);  
		}
		else if(isOp(str[i]))
		{
			int a,b;
			pop(s,&b);pop(s,&a);
			push(s,twoResult(a,str[i++],b));
		}
		else i ++;
	}
	pop(s,&r);
	return r;
} 

int main()
{
	char str[100];//输入中缀表达式
	while(1)
	{
		printf("输入中缀表达式: ");
		gets(str);
		printf("后缀表达式:%s\n",change(str)); 
		printf("表达式的值:%d\n",express(str));
	} 
    gets(str);
	/*if(Palindrome(str,strlen(str))==1)//计算长度 
	printf("YES");
	else
    printf("NO");*/
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值