用C语言不是C++做表达式求值:
发布网友
发布时间:2023-05-04 03:49
我来回答
共2个回答
热心网友
时间:2023-10-24 15:50
#include <stdio.h>
int Expression(char *s)
{
char *p;
int st[1000]; //存放数字栈
char sts[1000];//存放符号栈
int top,tops; //栈顶指针
char level[4]={'(','+','-','*'};//优先级
int i,j;
int A,B;//栈中数值
int sum=0;//返回值
char b[1000];//逆波兰串
p=s;
if(p==NULL) return 0;
//形成逆波兰串
for(p=b,tops=-1;*s;s++)
{
switch (*s)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':*p++=*s;break;//是数字存入数组
case '+':
case '-':
case '*'://运算符号
if(tops==-1)//如果是空栈,直接入栈
sts[++tops]=*s;
else//否则比较符号栈栈顶符号优先级
{
while(tops!=-1)//寻找比当前运算符不低的将其弹出并存入b
{
for(i=0;i<4;i++) {if(*s==level[i]) break;}
for(j=0;j<4;j++) {if(sts[tops]==level[j]) break;}
switch (i)
{
case 0:i=0;break;//(
case 1:
case 2:i=1;break;//+ -属于同级
case 3:i=3;break;//*
}
switch (j)
{
case 0:j=0;break;//(
case 1:
case 2:j=1;break;//+ -属于同级
case 3:j=3;break;//*
}
if(j>=i)
{
*p++=sts[tops--];//把优先级高于或者等于当前运算符的弹出存入b
}
else
{
sts[++tops]=*s;//把本次运算符压入栈
break;
}
}
if(tops==-1)//如果栈空,直接入栈
sts[++tops]=*s;
}
break;
case '('://(直接压入符号栈
sts[++tops]=*s;
break;
case ')'://)将符号栈直到(弹出到数组中
while(tops!=-1&&sts[tops]!='(')//寻找是(的将其弹出并存入b
{
*p++=sts[tops--];
}
tops--;//将(也弹出
break;
}
}
while(tops!=-1)//把符号栈剩余的符号将其弹出并存入b
{
*p++=sts[tops--];
}
*p='\0';
//printf("%s\n",b);
for(p=b,top=-1;*p;p++)//进行数值计算
{
switch (*p)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':st[++top]=*p-'0';break;//是数字压入总栈st中
case '+':
case '-':
case '*'://是运算符号
A=st[top--];
B=st[top--];//弹出2个数字
switch (*p)
{
case '+':sum=B+A;break;
case '-':sum=B-A;break;
case '*':sum=B*A;break;
}
st[++top]=sum;//将结果重新压入栈
break;
}
}
return sum;
}
void main()
{
char s[1000]={0};
scanf("%s",s);
printf("%d\n",Expression(s));
}
热心网友
时间:2023-10-24 15:51
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
//以下是 C代码,可以运行
int Expression(char *s)
{
char szOpt[256], szTemp[256], sz[256], *pp;
int Temp[256];
int nOpt, nNum, t;
if( !s ) return 0; //s is null
nOpt = 0;
nNum = 0;
pp = sz;
pp[0] = '(';
strcpy(pp+1, s);
strcat(pp, ")");
Temp[0] = 0;
while ( *pp )
{
if( *pp == '(' )
{
szOpt[nOpt++] = *pp++;
}
else if( isdigit(*pp) )
{
t = 0;
while ( isdigit(*pp) )
{
szTemp[t++] = *pp++;
}
szTemp[t] = 0;
Temp[nNum++] = atoi(szTemp);
}
else if( *pp == ')')
{
if( nOpt < 1)
{
printf("error: %s is invalid compression\n", s);
return 0;
}
if( nNum > 1)
{
if(szOpt[nOpt-1] == '+')
{
t = Temp[nNum-2] + Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt--;
}
else if(szOpt[nOpt-1] == '-')
{
t = Temp[nNum-2] - Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt--;
}
else if(szOpt[nOpt-1] == '*')
{
t = Temp[nNum-2] * Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt--;
}
else if(szOpt[nOpt-1] == '/')
{
t = Temp[nNum-2] / Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt--;
}
}
else if( nNum == 1)
{
printf("error: %s is invalid compression\n", s);
return 0;
}
if( szOpt[nOpt-1] == '(' )
{
nOpt--;
pp++;
}
}
else if( *pp == '+' || *pp == '-')
{
if(nOpt > 0 && nNum > 1)
{
if(szOpt[nOpt-1] == '+')
{
t = Temp[nNum-2] + Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt -= 1;
}
else if(szOpt[nOpt-1] == '-')
{
t = Temp[nNum-2] - Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt -= 1;
}
else if(szOpt[nOpt-1] == '*')
{
t = Temp[nNum-2] * Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt -= 1;
}
else if(szOpt[nOpt-1] == '/')
{
t = Temp[nNum-2] / Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt -= 1;
}
else if(szOpt[nOpt-1] == '(')
{
szOpt[nOpt++] = *pp;
pp++;
}
}
else
{
szOpt[nOpt++] = *pp;
pp++;
}
}
else if( *pp == '*' || *pp == '/')
{
if( nOpt > 0 && nNum > 1)
{
if(szOpt[nOpt-1] == '*')
{
t = Temp[nNum-2] * Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt -= 1;;
}
else if(szOpt[nOpt-1] == '/')
{
t = Temp[nNum-2] / Temp[nNum-1];
Temp[nNum-2] = t;
nNum -= 1;
nOpt -= 1;
}
else
szOpt[nOpt++] = *pp++;
}
else
{
szOpt[nOpt++] = *pp++;
}
}
else
*pp++;
}
return Temp[0];
}追问组建时报错