问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用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];
}追问组建时报错

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
现在家里用空调买什么比较好,变频空调好吗! 公司不承认劳动关系,我找了两个证人 ,证明材料也有,还盖了手印的,但是... ...一直到现在也没签劳动合同,现公司要辞退我们,请问我们可以得到什么赔... 2002年9月10号早上6.7点钟出生的女子命运如何 我是86年12月4日出生的大概6.7点时候麻烦帮我看看我的婚姻事业 有美国绿卡,在其他国家工作,还需要给美国交税吗? 我是中国国籍,在日本就职,公司想派我回上海分公司短期帮忙,会有签证... 上海职工在日本取得的补贴收入要在上海交个税吗? 王楚钦底板配置套胶 乒乓球器材基础知识|底板|套胶|胶水|常见问题 C语言——问题解答4 Oracle中 :sts:=0 表示什么意识 即 变量的前后都加冒号 C语言文件排序问题 C语言函数啊 中括号M代表什么? 主要是写论文的财考文献的时候,常常会看见一个作品的后面有个“[M]” 不知道代表什么啊 论文中括号中的名字和时间是什么意思 生活需要目标,目标是生活的灵魂 22个灵魂课题,引领你活出最高级版本的自己!(建议收藏) 你今生的22个灵魂课题 灵魂追求是什么意思 目标与灵魂怎么理解 欧洲有喜欢老虎的国家么 为什么欧洲人很喜欢狮子和老鹰 欧洲有没有野生的狮子老虎 欧洲本土有老虎吗 葡萄牙有没有老虎 欧洲有狮子和老虎吗 欧洲有老虎么 《天鹅挽歌》结局是什么? 电竞禁止挂牌是什么意思 迈腾机盖上的12L是什么意思? 重汽重卡12l排量是什么意思 发动机10升和12升马力差多少 汽车1.0L和.12L的区别 广西桂林全州话:红坨坨是什么意思? 我身上最近起了很多坨,又大又红,这是怎么了 身上到处出现又大又红又痒的坨坨是怎样引起的? 梦见前夫病了的预兆 要学吉他先练什么 what&#39;s DDP? 请问练吉他最开始练什么啊 轻现金社会最显著的特点是什么? “轻现金社会”给国家金融安全等带来挑战了吗? 轻现金社会会对哪些群体造成伤害? 大家觉得未来能否成为无现金社会? 电池管理的节能、均衡、高性能,有什么区别呢? 为什么越是发达国家,越反对无现金社会? 我国反对无现金社会的是哪些人? 魅族4pro 电池模式 节能 均衡 高性能是什么意思 名字五行维度不符合什么意思