后缀表达式(C语言一些奇奇怪怪的题目!栈的简单应用之后缀表达式求值问题)

题目


如下程序,如何实现


数据测试以及输出:


学前知识

后缀表达式(将运算符写在操作数之后)也叫逆波兰式(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 <stdio.h> #include <stdlib.h> #include <string.h> 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; else i++; } 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("%.2fn", result[i]); } system("pause"); } 尾言

如果你基础比较差,不妨关注视频教程专栏教程《C语言51课视频教程合集片》,通俗易懂,深入浅出,文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

如果栈不懂,不妨研究下数据结构哦,图文并茂,通俗易懂《数据结构哪些事》

世上唯一不能复制的是时间,唯一不能重演的是人生。该怎么走,过什么样的生活,全凭自己的选择和努力。

您可以还会对下面的文章感兴趣

暂无相关文章

使用微信扫描二维码后

点击右上角发送给好友