C语言 计算给定字符串表达式的值

C语言 计算给定字符串表达式的值

  • 可以包括加减乘除运算以及括号运算
  • 代码

#include<stdio.h>
#include<string.h>

#define maxn 100005

char s[maxn],infixList[maxn][10];
char suffix[maxn][10];
int p=0;
char tmp[maxn];
int p1=0;

//把字符串根据操作数、运算符、括号拆开,存储到infixList数组中
int toInfixExpression(char *s) {
	int tot=0,n=strlen(s);
	for(int i=0;i<n;i++) {
		if(s[i]>='0'&&s[i]<='9') {
			int p=0;
			infixList[tot][p++]=s[i];
			while(i+1<n&&s[i+1]>='0'&&s[i+1]<='9') {
				infixList[tot][p++]=s[++i];
			}
			tot++;
		}else{
			infixList[tot++][0]=s[i];
		}
	}
	return tot;
}

//获得优先级
int getPriority(char c) {
	if(c=='+'||c=='-') return 1;
	else if(c=='*'||c=='/') return 2;
	else return 0; //处理'('的情况
}

//转换成后缀表达式
void parseSuffixExpression(char s[][10],int n) {

	for(int i=0;i<n;i++) {
		if(s[i][0]>='0'&&s[i][0]<='9') {
			strcpy(suffix[p++],s[i]);
		}else if(s[i][0]=='('){
			tmp[p1++]=s[i][0];
		}else if(s[i][0]==')') {
			while(tmp[p1-1]!='(') {
				suffix[p++][0]=tmp[--p1];
			}
			p1--;
		}else{
			while(p1!=0 && getPriority(tmp[p1-1])>=getPriority(s[i][0])){
				suffix[p++][0]=tmp[--p1];
			}
			tmp[p1++]=s[i][0];
		}
 	}
 	while(p1!=0) {
 		suffix[p++][0]=tmp[--p1];
 	}
}

//计算一个以字符串形式存储的数的值
int parseInt(char *s) {
	int k=strlen(s);
	int ans=0;
	for(int i=0;i<k;i++) {
		ans=ans*10+(s[i]-'0');
	}
	return ans;
}

//将数k转化成字符串形式存储到指针s开始的地方
void parseString(char *s,int k){
	char b[11];
	int point=0;
	do{
		b[point++]=(char)('0'+k%10);
		k/=10;
	}while(k!=0);
	for(int i=point-1,j=0;i>=0;i--,j++) {
		*(s+j)=b[i];
	}
	*(s+point)='\0';
}

//计算后缀表达式的值
int calculate() {
	int point=0;
	char t[maxn][10];
	int m=1;
	for(int i=0;i<p;i++) {
		int k=strlen(suffix[i]);
		if(suffix[i][0]>='0'&&suffix[i][0]<='9') {
			strcpy(t[point++],suffix[i]);
			t[point-1][k]='\0';
		}else {
			int b=parseInt(t[--point]);
			int a=parseInt(t[--point]);
			int res=0;
			if(suffix[i][0]=='+') {
				res=a+b;
				printf("(%d) %d + %d = %d\n",m++,a,b,res);
			}else if(suffix[i][0]=='-') {
				res=a-b;
				printf("(%d) %d - %d = %d\n",m++,a,b,res);
			}else if(suffix[i][0]=='*') {
				res=a*b;
				printf("(%d) %d * %d = %d\n",m++,a,b,res);
			}else if(suffix[i][0]=='/') {
				if(b==0) {
					printf("除数为零出错!!!\n");
					return -1;
				}
				res=a/b;
				printf("(%d) %d / %d = %d\n",m++,a,b,res);
			}
			parseString(t[point],res);
			point++;
		}
	}
	return parseInt(t[0]);
}

int main() {
	//输入字符串
	while(1) {
		p=p1=0;
		printf("------------------------------\n");
		printf("请输入待计算的表达式:");
		scanf("%s",s);
		int infixNum=toInfixExpression(s);
		parseSuffixExpression(infixList,infixNum);

		printf("运算过程如下所示:\n");
		int ans=calculate();
		printf("运算结果为: %d\n",ans);
		printf("------------------------------\n");
		printf("请选择是否继续(输入0表示退出,否则继续):");
		int opt;
		scanf("%d",&opt);
		if(opt==0) break;
		printf("\n");

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值