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;
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;
}
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");
}
}