#include<stdio.h>
#include<stdlib.h>
#define MaxSize 99
void translate(char str[], char exp[]) /*将算术表达式转换成后缀表达式*/
{
struct
{
char data[MaxSize];
int top; /*top为栈顶*/
}op; /*定义一个含data和top的结构体*/
char ch;
int i = 0, t = 0;
op.top = -1;
ch = str[i]; /*将str的每一个数转换成ch*/
i++;
while (ch != '\0') /*ch对应不同的符号的时候对应的转换情况*/
{
switch (ch)
{
case '(': /*当是(的时候,将此括号存入栈op*/
op.top++; op.data[op.top] = ch;
break;
case ')':
while (op.data[op.top] != '(') /*括号内的转换优先级最高,故先提取表达式*/
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top--;
break;
case '+':
case '-':
while (op.top != -1 && op.data[op.top] != '(')
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top++; /*恢复可插入位置*/
op.data[op.top] = ch;
break;
case '*':
case '/':
while (op.top == '/' || op.top == '*') /*优先级*/
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top++;
op.data[op.top] = 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 (op.top != -1) /*得到剩下的部分*/
{
exp[t] = op.data[op.top];
t++;
op.top--;
}
exp[t] = '\0'; /*表达式结束*/
}
float cal_value(char exp[])
{
struct
{
float data[MaxSize];
int top;
}st; /*操作数栈*/
float d;
char ch;
int t = 0;
st.top = -1;
ch = exp[t];
t++;
while (ch != '\0')
{
switch (ch) /*运算主体*/
{
case '+':
st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];
st.top--;
break;
case '-':
st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
st.top--;
break;
case '*':
st.data[st.top - 1] = st.data[st.top - 1] * st.data[st.top];
st.top--;
break;
case '/':
if (st.data[st.top] != 0)
st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
else
{
printf("\n\t除0是错误的");
}
st.top--;
break;
default:
d = 0;
while (ch >= '0'&&ch <= '9') /*从后缀表达式中获取操作数,#作用在此体现*/
{
d = 10 * d + ch - '0';
ch = exp[t];
t++;
}
st.top++;
st.data[st.top] = d;
}
ch = exp[t];
t++;
}
return st.data[st.top];
}
int main() /*可以提到前面去*/
{
char str[MaxSize], exp[MaxSize]; /*str为算术表达式,exps为后缀表达式*/
printf("请输入一个求值表达式\n");
printf("表达式:");
gets(str); /*输入一个算术表达式*/
printf("原表达式是:%s\n", str);
translate(str, exp); /*将算术表达式转换成后追表达式*/
printf("&&&&&&&&&&&");///
printf("后缀表达式:%s\n", exp);
printf("计算结果:%g\n", cal_value(exp));/*通过后缀表达式来求值*/
system("pause");
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
postfix-notation.zip_E->E+T_E->E+T E->T
共1个文件
cpp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 83 浏览量
2022-09-19
22:13:02
上传
评论
收藏 1KB ZIP 举报
温馨提示
1、给出文法如下: G[E] E->T|E+T T->F|T*F F->i(E) 对应的转化为逆波兰式的语义动作如下: E-> E(1)op E(2) {E.CODE:= E(1).CODE||E(2).CODE||op} E->(E(1)) { E.CODE := E(1).CODE} E->id { E.CODE := id} 2、利用实验5中的算符优先分析算法,结合上面给出的语义动作实现逆波兰式的构造; 3、利用栈,计算生成的逆波兰式,步骤如下: 1)中缀表达式,从文本文件读入,每一行存放一个表达式,为了降低难度,表达式采用常数表达式; 2)利用结合语法制导翻译的算符优先分析,构造逆波兰式; 3)利用栈计算出后缀式的结果,并输出;
资源详情
资源评论
资源推荐
收起资源包目录
postfix-notation.zip (1个子文件)
postfix notation.cpp 3KB
共 1 条
- 1
刘良运
- 粉丝: 77
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0