博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
02-线性结构3. 求前缀表达式的值(25)
阅读量:6705 次
发布时间:2019-06-25

本文共 2136 字,大约阅读时间需要 7 分钟。

02-线性结构3. 求前缀表达式的值(25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式说明:

输入在一行内给出不超过30个字符的前缀表达式,仅仅包括+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式说明:

输出前缀表达式的运算结果。精确到小数点后1位。或错误信息“ERROR”。

例子输入与输出:

序号 输入 输出
1
+ + 2 * 3 - 7 4 / 8 4
13.0
2
/ -25 + * - 2 3 4 / 8 4
12.5
3
/ 5 + * - 2 3 4 / 8 2
ERROR
4
+10.23
10.2

#include 
#include
#include
double parseNum(char *s, int head, int rear) { //分析字符串。返回相应数值 double ret = 0; double flag = 1; //标记数值正负号 if (s[head] == '+' || s[head] == '-') { //推断正负号 if (s[head] == '-') flag = -1; ++head; } while (head <= rear && s[head] != '.') { //处理小数点之前部分。即整数部分 ret = 10 * ret + (s[head] - '0'); ++head; } if (s[head] == '.') { //假设有小数部分,计算小数部分 ++head; double weight = 0.1; while (head <= rear) { ret += (double)(s[head] - '0') * weight; weight *= 0.1; ++head; } } return flag * ret;}int main() { char s[30]; gets(s); double numStack[15]; //用于储存操作数的栈 int numSize = 0; //栈元素个数 int rear = strlen(s) - 1; //从输入字符串尾部開始遍历。遇到操作数将其压入栈中;遇到操作符。弹出栈顶两个元素运算,运算结果入栈 for (int head = rear; rear >= 0; --head) { if (head == -1 || s[head] == ' ') { //两个空格之间为一个处理单元;第一个处理单元前没有空格。head = -1推断 //假设是个操作符,从操作数栈中弹出两个数进行运算,运算结果入栈 if (rear - head == 1 && (s[rear] == '+' || s[rear] == '-' || s[rear] == '*' || s[rear] == '/')) { double num1 = numStack[--numSize]; double num2 = numStack[--numSize]; switch (s[rear]) { case '+': numStack[numSize++] = num1 + num2; break; case '-': numStack[numSize++] = num1 - num2; break; case '*': numStack[numSize++] = num1 * num2; break; case '/': numStack[numSize++] = num1 / num2; if (num2 < 1e-5 && num2 > -1e-5) { //被除数是0时输出错误信息,终止程序 printf("ERROR\n"); return 0; } break; } } else { //假设是操作数,分析数值后入栈 numStack[numSize++] = parseNum(s, head + 1, rear); } rear = head - 1; } } printf("%.1f\n", numStack[0]); return 0;}

题目链接:http://www.patest.cn/contests/mooc-ds/02-%E7%BA%BF%E6%80%A7%E7%BB%93%E6%9E%843

转载地址:http://gsflo.baihongyu.com/

你可能感兴趣的文章
用例子解释事件模型和事件代理
查看>>
熊晨沣蓝牙实战--小程序蓝牙连接2.0
查看>>
Swift基础--属性
查看>>
Nuxt之目录结构与常用配置
查看>>
从零开始机器学习-03
查看>>
Spring Cloud构建微服务架构-Hystrix断路器
查看>>
敏捷开发
查看>>
Object.defineProperty()
查看>>
加班与效率
查看>>
package.json更新模块
查看>>
Angular学习笔记
查看>>
教你不编程快速解析 JSON 数据
查看>>
splice()方法采坑
查看>>
全面解析this
查看>>
MongoDB的可视化工具(Studio 3T)
查看>>
Handler全家桶之 —— Handler 源码解析
查看>>
正则表达式
查看>>
通过BitSet源码来理解BitMap算法
查看>>
Windows7 支持即将终止!还有不知道的吗?
查看>>
学习springBoot(12)定时任务
查看>>