如下程序,如何实现
数据测试以及输出:
后缀表达式(将运算符写在操作数之后)也叫逆波兰式(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课视频教程合集片》,通俗易懂,深入浅出,文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。
如果栈不懂,不妨研究下数据结构哦,图文并茂,通俗易懂《数据结构哪些事》
世上唯一不能复制的是时间,唯一不能重演的是人生。该怎么走,过什么样的生活,全凭自己的选择和努力。