求值表达式物业
2021-09-06 09:58 来源:莱西养生网
所谓的求值表达式,就是给出一个中缀表达式,然后要求将它转换成后追表达式,再利用后缀表达式求出它的值。
例如:()/()这是一个中缀表达式,要求将它转换成后缀表达式,为45#35#—65#62#+/,计算的时候,首先将后缀表达式的数相计算,如此例题,首先是 45,然后接下来是35,再接着是—,于是,就成为,计算出结果是10,10有相当于一个数,和接下来的65又成两个数,即10,65,然后后面没有运算符号,将后面的数字在和他们在一起 ,用专业术语,即进栈,就成为了10,65,62,接下来遇见的是+,又要出来最后的两个数,把65,62出来,相加,即65+62,答案是127,然后栈变成了10,127,最后的符号是/,两个数于是进行除法运算,即10/127。
中缀表达式:就是预算夫位于两个数字的中间的表达式,比如:2+4,就是一个中缀表达式,中缀表达式我们平常接触的多很多了,就没有必要多讲,平常在数学上面运用的基本都是中缀表达式,没有用到后缀表达式。后缀表达式,就是运算符号在操作数的后面,例如123*-,就是一个后缀表达式,他已经考虑到了运算符的优先顺序,我们也没有必要考虑到哪一点,还有一点就是后缀表达式里面不可能有()号。
后缀表达式的求值过程关键就是要理解栈,要把栈的一切远离都弄明白,那计算后追表达式就很容易了。求后缀表达式的过程是:从左到右,假如读入的是一个数字,就将他入栈,如果是一个运算符,就将栈内的前面的两个操作数出栈,然后和运算符在一起,计算出结果,然后再将结果如栈。
求值表达式的具体的程序用c语言表示为:
#includestdio.h
#define MaxSize 99
void trans(char str[],char exp[]) /*将算术表达式转换成后追表达式*/
{
struct
{
char data[MaxSize];
int top; /*top为栈顶*/
}op; /*定义一个含data和top的结构体*/
char ch;
int i=0,t=0;
p=-1;
ch=str[i]; /*将str的每一个数转换成ch*/
i++;
while(ch!=\'\\0\') /*ch对应不同的符号的时候对应的转换情况*/
{
switch(ch)
{
case\'(\': /*当是(的时候,将此括号存入栈tp*/
Czinger的3D打印超跑首次亮相。这种特殊的机器(对于通常的汽车来说) p++;ta[p]=ch;
break;
case\')\':
while(ta[p]!=\'(\')
{
exp[t]=ta[p];
p--;
t++;
}
p--;
break;
case\'+\':
case\'-\':
while(p!=ta[p]!=\'(\')
{
exp[t]=ta[p];
p--;
t++;
}
p++;
ta[p]=ch;
break;
case\'*\':
case\'/\':
while(p==\'/\'||p==\'*\')
{
exp[t]=ta[p];
p--;
t++;
}
p++;
ta[p]=ch;
break;
case\' \':
break;
default:
while(ch=\'0\'ch=\'9\')
{
exp[t]=ch;t++;
ch=str[i];i++;
}
i--;
exp[t]=\'#\';
t++;
}
ch=str[i];
i++;
}
while(p!=-1)
{
exp[t]=ta[p];
t++;
p--;
}
exp[t]=\'\\0\';
}
float compvalue(char exp[])
{
struct
{
float data[MaxSize];
int top;
}st;
float d;
char ch;
int t=0;
p=-1;
ch=exp[t];
t++;
while(ch!=\'\\0\')
{
switch(ch)
{
case\'+\':
ta[p-1]=ta[p-1]+ta[p];
p--;
break;
case\'-\':
ta[p-1]=ta[p-1]ta[p];
p--;
break;
case\'*\':
ta[p-1]=ta[p-1]ta[p];
p--;
break;
case\'/\':
if(ta[p]!=0)
ta[p-1]=ta[p-1]ta[p];
else
{
printf(\"\\n\\t除0是错误的\");
}
p--;
break;
default:;
d=0;
while(ch=\'0\'ch=\'9\')
{
d=10*d+ch-\'0\';
ch=exp[t];
t++;
}
p++;
ta[p]=d;
}
ch=exp[t];
t++;
}
return ta[p];
}
void main() /*可以提到前面去*/
{
char str[MaxSize],exps[MaxSize]; /*str为算术表达式,exps为后缀表达式*/
printf(\"请输入一个求值表达式\\n\");
printf(\"表达式:\");
gets(str); /*输入一个算术表达式*/
printf(\"原表达式是:%s\\n\",str);
trans(str,exps); /*将算术表达式转换成后追表达式*/
printf(\"后缀表达式:%s\\n\",exps);
printf(\"计算结果:%g\\n\",compvalue(exps));/*通过后缀表达式来求值*/
}
这是一个正确的关于求值表达式的程序,可以在vc++上面运行,如果感到有兴趣,可以自己运行一下,可以将各种算术表达式即中缀表达式转换成后缀表达式,然后再计算出结果。
福州治疗前列腺炎医院关节畸形是什么原因造成的
伊春治白癜风哪里最好
- 上一篇:求伯君金融风暴带来股市投资机会
- 下一篇:求出一年中以年为例所有的周六和周计划
-
大白熊犬嘴巴周围长很多小疙瘩是什么皮肤病位置
大白熊犬嘴巴下面起了很多小疙瘩,是什么皮肤病?往事随风:我家大白熊犬以前皮肤因为夏天的原因,大白熊犬皮肤也起过变得红红的,后来用酒精擦过、买大白熊犬专用的除螨喷剂喷它的皮肤,平时看着它让它...
-
大白熊犬吠叫训练位置
导读:大白熊犬吠叫训练,饲养宠物狗狗最怕的就是扰邻,打扰到邻居休息是一件麻烦的事情,遇到个别邻居还投诉,最后只能送人。虽然现在有那种认为忒过残忍的止吠手术,但那是一种残忍、一种伤害!按照动...
-
大白熊犬吃错东西呕吐拉稀需要吃什么药位置
昨天吃了西瓜和哈密瓜,到了晚上就拉稀,然后吃了点狗粮就开始呕吐,今天拉的是水状屎,吃什么药治疗?风舞雪:只吐不拉的话很有可能是异物卡在胃里了,上回我一个朋友家的大白熊犬就是吃了一个球球,结...
-
大白熊犬只喝水不吃东西是为什么呢位置
我家大白熊犬只喝水,不吃东西!已经三天了,这是为什么呢?棒棒炮:怀疑是腺病毒,传染性肝炎之类的。建议去做个详细的检查,大白熊犬在没有确诊的情况下,不能随便用药哦。犬瘟的可能性也有,如果是犬...
-
大白熊犬反复的发烧如何降温位置
大白熊犬最近反复的发烧,应如何降温云上舞:我家大白熊犬价格也是这病。先退烧。买美林给它喝。每次3毫升。每日两次。然后再买清开灵口服液,每日两次。还有就是它咳嗽的话买止咳水给它喝。如果要给它...
-
大白熊犬为什么会喜欢咬其他狗狗的耳朵位置
家里新来了只70天的大白熊犬DD,今晚发现家里半岁的泰迪MM总是咬金毛的耳朵,也不是真的咬,就是轻轻地咬一下就跑了,一会还去咬,卖狗不知道怎么回事?脚心大佐:真的是跟你玩呢!!!!只能表示出它特别的喜...