中易网

C语言怎么识别后缀式

答案:3  悬赏:40  
解决时间 2021-01-11 00:34
C语言怎么识别后缀式
最佳答案
后缀式都能求出来了,那几乎成功了啊。
首先说明一下,我做的程序数字和符号在一个结构体中,也就是说栈的基本元素的类型是复合型,有二块数据,数字部分和符号部分。如果是数字就存放数字,符号随便存个东西;如果是符号就存符号,数字可以不管他。(当然不知道你是怎样的,可能数字只是一个简单的一位0~9的字符,这样更简单些,但你要能区分数字和运算符号,这个不难吧)
我是这样做的,假设你刚才已经进栈的ab*cde/-f*+叫做X栈(+是栈头,a是栈尾),我利用另一个空的栈Y来保持中间数据。我开始解释一遍你下来要做的过程。从X中弹出一个数据,如果是符号,压入栈Y中,这样中变成Y:+*;当X的栈顶是数字时,立刻检测X的下一个是不是也是数,再检测Y栈顶是不是符号。(顺序随便),显然这里没有满足,不满足就继续压入Y中,Y:+*f-/;这时,X:ab*cde,满足了刚才说到情况,弹出X中第一个数和第二个数分别为x1:e,x2:d,弹出Y中运算符号/,然后做运算d/e,所得的结果ans1放到Y中,Y:+*f-ans1;X:ab*c,这时继续这样判断下去。
下面列一下,你好好看下,简单的步骤就跳过了:
X:ab*cde/-f*+Y:
X:ab*cde Y:+*f-/
G=d/e
X:ab*cGY:+*f-
H=c-G=c-d/e
X:ab*H Y:+*f
也可以考虑这时把它变成(X:ab*HfY:+*)再操作
也就是说二边都是数据,把Y的弹出压入X中,再判断Y中运算符号
I=H*f=(c-d/e)*f
X:ab*I Y:+
X:ab*Y:+I
X:ab Y:+I*
J=a*b
X:JY:+I
K=j+I=a*b+(c-d/e)*f
X:K
直到X栈中没有东西了(栈空),这时Y中存放了最终的数据了。

这个部分一般要自己想出来,因为已经做出后缀式已经成功了。当然计算时,考虑各种可能出错的情况,比如除以0,或者特殊情况特殊处理等等。加油吧。
全部回答
//.h文件中
#ifndef _BDS_H
#define _BDS_H
typedef struct
{
char *base;
char *top;
int size;
}STACK;
#define size_init 100
#define size_increase10
int stack_init(STACK *S);
int push(STACK *S,char e);
int pop(STACK *S);
char get_top(STACK *S);
void change (char str[],char after_change[]);
float caculate(char after_change[]);
#endif

#include<stdio.h>
#include"bds.h"
STACK S1,S2;

void change (char str[],char after_change[])
{
int i = 0;
int k = 0;
stack_init(&S1);
// push(*S1,'#');
while(str[i] != '\0')
{
switch(str[i])
{
case'(':
push(&S1,str[i]);
break;
case')':
if(get_top(&S1) != '(')
{
after_change[k] = get_top(&S1);
pop(&S1);
k++;
}
pop(&S1);
break;
case'+':
case'-':
if((S1.base != S1.top) && (get_top(&S1) != '('))
{
after_change[k] = get_top(&S1);
pop(&S1);
k++;
}
push(&S1,str[i]);
break;
case'*':
case'/':
while(get_top(&S1) == '*' ||get_top(&S1) == '/')
{
after_change[k] = get_top(&S1);
pop(&S1);
k++;
}
push(&S1,str[i]);
break;
case' ':break;
default:
while(str[i] >='0' &&str[i] <='9')
{
after_change[k] = str[i];
k++;
i++;
}
i--;
after_change[k] = '#';
k++;
}
i++;
}
while(S1.top != S1.base)
{
after_change[k] = get_top(&S1);
k++;
pop(&S1);
}
after_change[k] = '\0';
}

float caculate(char after_change[])
{
int i = 0;
float num;
char temp,result;
stack_init(&S2);
while(after_change[i] != '\0')
{
switch(after_change[i])
{
case'+':
temp = get_top(&S2);
pop(&S2);
temp = get_top(&S2)+temp;
pop(&S2);
push(&S2,temp);
break;
case'-':
temp = get_top(&S2);
pop(&S2);
temp = get_top(&S2)-temp;
pop(&S2);
push(&S2,temp);
break;
case'*':
temp = get_top(&S2);
pop(&S2);
temp = get_top(&S2)*temp;
pop(&S2);
push(&S2,temp);
break;
case'/':
if(get_top(&S2) != 0)
{
temp = get_top(&S2);
pop(&S2);
temp = get_top(&S2)/temp;
pop(&S2);
push(&S2,temp);
}
else
{
printf("\n除零错误!\n");
return (0);
}
break;
default:
num =0;
while(after_change[i] >= '0' &&after_change[i] <= '9')
{
num = 10*num +after_change[i]-'0';
i++;
}
push(&S2,(char)num);
}
i++;
}
// result = *(S2.top);
// pop(&S2);
// result = result + get_top(&S2);
return get_top(&S2);
}

#include<stdio.h>
#include"bds.h"
char after_change[100],str[100];
void main()
{
printf("请输入表达式:\n");
gets(str);
printf("原表达式为:%s\n",str);
change (str,after_change);
printf("后缀表达式为:%s\n",after_change);
printf("计算结果为:");
printf("%g\n",caculate(after_change));
}
后缀:把运算符号移动到对应的括号后面
则变成拉:((a(bc)* )+ (de)+ )-
把括号去掉:abc*+de+- 后缀式子出现
发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。如表达式:3+(2-5)*6/3
后缀表达式 栈
3 +
3 +(
3 2 +(-
3 2 5 - +
3 2 5 - +*
3 2 5 - 6 +*/
3 2 5 - 6 3 +*/
3 2 5 - 6 3 / * +
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
建筑中N代表腰筋G代表什么?
为什么在lol职业赛中看不到冰鸟的身影?
怎样涂颜色
赐富怎么去啊,有事要去办理
赵本山怎么又出来了,不是有问题你是赵本山什
求黑山起源中文正式版 百度网盘
大运375e没劲少机油
张韶涵有一首歌的歌词是 乱掉,乱掉 这首歌的
LIGHTWHITE玻璃艺术工作室地址在哪,我要去那
竹鼠都是卖那里去的
E.迪奥婚纱摄影会馆地址在哪,我要去那里办事
嗯哼,,嗯哼一吃卡米哦我飞,一首英文歌
6点4寸屏是多少厘米?
朗逸车 发动机在1600至2200转机油灯亮是怎么
每个型号的槽钢多少公斤以下算轻槽,谢谢大家
推荐资讯
黑暗之魂3绘画世界为什么有颗树妖在哭
请问八字中七杀和食神,再遇枭神,不贫则夭。
一个人若有一百只羊,一只走迷了路,你们的意
茜下面加个大是什么字,读音是?
重装武器的音乐专辑
年月日家俬富川店地址在什么地方,想过去办事
dnf为什么现在的G.S.D人偶只会用光翼了其他技
做土司用的老面团是什么?
搜狗神曲 进不去
魔兽争霸1.27什么时候出?据说是专门为了dota
叶子怎么吹音
21○10○8○2=24填入十-×÷怎么解
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?