c语言中缀表达式求值_C语言一些奇奇怪怪的题目!栈的简单应用之后缀表达式求值问题...

题目

a3d499dd5d344133fd8419f64819d4de.png

如下程序,如何实现

7319b85b6a3379e4080fda92ccb4564f.png

数据测试以及输出:

a4a3c6c7110ab700f5d40f4079884261.png

学前知识

后缀表达式(将运算符写在操作数之后)也叫逆波兰式(Reverse Polish notation,RPN,或逆波兰记法)。

如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+

(a+b)*c-(a+b)/e的后缀表达式为:(a+b)*c-(a+b)/e

→((a+b)*c)((a+b)/e)-

→((a+b)c*)((a+b)e/)-

→(ab+c*)(ab+e/)-

→ab+c*ab+e/-

解析过程

新建一个表达式,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。难点在于如何拆分数字。

实现代码

#define _CRT_SECURE_NO_WARNINGS#include #include #include float num[256] = { 0 };float comp(char s[]){int i = 0, top = 0, x;while (i <= strlen(s) - 2){switch (s[i]){case'+':num[--top] += num[top + 1]; break;case'-':num[--top] -= num[top + 1]; break;case'/':num[--top] /= num[top + 1]; break;case'*':num[--top] *= num[top + 1]; break;default: x = 0;while (s[i] != ' '){x = x * 10 + s[i] - '0';//数if (s[i + 1] == '+' || s[i + 1] == '/' || s[i + 1] == '*' || s[i + 1] == '-')break;elsei++;}num[++top] = (float)x; break;}i++;}return num[top];}int main(){float result[100];int count = 0;while (1){char inputStr[20] = "";gets(inputStr);if (strcmp(inputStr, "=") == 0){break;}result[count++] = comp(inputStr);memset(inputStr, 0, 20);}for (int i = 0; i < count; i++){printf("%.2f
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值