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
    评论
中缀表达式可以通过将中缀表达式转换为后缀表达式,然后再对后缀表达式进行求来实现。以下是一个简单的中缀表达式的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define STACK_SIZE 100 typedef struct { double data[STACK_SIZE]; int top; } Stack; void initStack(Stack* s) { s->top = -1; } int isStackEmpty(Stack* s) { return s->top == -1; } int isStackFull(Stack* s) { return s->top == STACK_SIZE - 1; } void push(Stack* s, double data) { if (isStackFull(s)) { fprintf(stderr, "Stack overflow.\n"); exit(EXIT_FAILURE); } s->data[++s->top] = data; } double pop(Stack* s) { if (isStackEmpty(s)) { fprintf(stderr, "Stack underflow.\n"); exit(EXIT_FAILURE); } return s->data[s->top--]; } int priority(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } double evaluate(double op1, char operator, double op2) { switch (operator) { case '+': return op1 + op2; case '-': return op1 - op2; case '*': return op1 * op2; case '/': return op1 / op2; default: fprintf(stderr, "Invalid operator: %c\n", operator); exit(EXIT_FAILURE); } } double evaluateInfixExpression(char* infix) { Stack operatorStack; double operandStack[STACK_SIZE]; int operandCount = 0; char* token = strtok(infix, " "); while (token != NULL) { if (isdigit(token[0])) { operandStack[operandCount++] = atof(token); } else { while (!isStackEmpty(&operatorStack) && priority(token[0]) <= priority(operatorStack.data[operatorStack.top])) { double op2 = operandStack[--operandCount]; double op1 = operandStack[--operandCount]; char operator = pop(&operatorStack); operandStack[operandCount++] = evaluate(op1, operator, op2); } push(&operatorStack, token[0]); } token = strtok(NULL, " "); } while (!isStackEmpty(&operatorStack)) { double op2 = operandStack[--operandCount]; double op1 = operandStack[--operandCount]; char operator = pop(&operatorStack); operandStack[operandCount++] = evaluate(op1, operator, op2); } return operandStack[0]; } int main() { char infix[STACK_SIZE]; printf("Enter an infix expression: "); fgets(infix, sizeof(infix), stdin); printf("Result: %f\n", evaluateInfixExpression(infix)); return 0; } ``` 该程序使用两个栈,一个用于存储操作符,另一个用于存储操作数。它首先将中缀表达式字符串分解成单词,然后扫描每个单词,如果它是一个操作数,则将其推入操作数栈,否则将其与操作符栈的栈顶元素进行比较。如果其优先级高于操作符栈的栈顶元素,则将其推入操作符栈,否则将操作符栈的栈顶元素弹出,与两个操作数栈的栈顶元素进行操作并将结果推入操作数栈。最后,当操作符栈为空时,操作数栈的栈顶元素即为表达式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值