任务描述:
1.从文件读取表达式,判断表达式是否合理;
2.将表达式转为后缀形式;
3.求值
解决方案:
一.文件读取:
FILE fp;//文件指针
fp = fopen("demo.txt","r");
char expr[20] = {0};
char c;
int i = 0;
while( (c = fgetc(fp) != EOF){//读到文件末尾时返回的是EOF
expr[i] = c;
i++;
}
二.判断是否合理见 https://blog.csdn.net/lvdoujack/article/details/91491556
三.中缀形式转后缀形式:
1.数字直接保存进后缀表达式
2.操作符需要判断
(1)栈空则入栈;
(2)栈非空则比较当前op和栈顶op的优先级
当前 ‘(’ 大于所有栈顶op;
当前 ‘)’ 等于 栈顶 '(' ,小于其它栈顶op;
当前op与栈顶op同级时,当前op小于栈顶op;
当前op是 + - 小于 栈顶*/
当前op是 * / 大于 栈顶+-
(3)判断结果做处理
大于:当前op入栈
等于:此时为左右括号相遇,将栈顶op弹出且当前op不作处理
小于:栈顶op出栈并且存入后缀表达式,当前op继续与新的栈顶op比较。
3.扫描完成后若栈非空则依次出栈存入后缀表达式
四.后缀表达式求值
1.遍历后缀表达式
2.遇见数字时入栈
3.遇见操作符时依次出栈操作数b,a做运算a op b,结果入栈
4.遍历完成后栈内的那个元素即是结果