C语言怎么识别后缀式
答案:3 悬赏:40
解决时间 2021-01-11 00:34
- 提问者网友:自食苦果
- 2021-01-10 21:18
C语言怎么识别后缀式
最佳答案
- 二级知识专家网友:毛毛
- 2021-01-10 21:36
后缀式都能求出来了,那几乎成功了啊。
首先说明一下,我做的程序数字和符号在一个结构体中,也就是说栈的基本元素的类型是复合型,有二块数据,数字部分和符号部分。如果是数字就存放数字,符号随便存个东西;如果是符号就存符号,数字可以不管他。(当然不知道你是怎样的,可能数字只是一个简单的一位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,或者特殊情况特殊处理等等。加油吧。
首先说明一下,我做的程序数字和符号在一个结构体中,也就是说栈的基本元素的类型是复合型,有二块数据,数字部分和符号部分。如果是数字就存放数字,符号随便存个东西;如果是符号就存符号,数字可以不管他。(当然不知道你是怎样的,可能数字只是一个简单的一位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,或者特殊情况特殊处理等等。加油吧。
全部回答
- 1楼网友:毛毛
- 2021-01-10 23:36
//.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));
}
#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));
}
- 2楼网友:街头电车
- 2021-01-10 22:05
后缀:把运算符号移动到对应的括号后面
则变成拉:((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 / * +
则变成拉:((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 / * +
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯