题目
如下程序,如何实现
数据测试以及输出:
学前知识
后缀表达式(将运算符写在操作数之后)也叫逆波兰式(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