3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
题目链接:http://pat.zju.edu.cn/contests/ds/3-07
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式说明:
输入在一行内给出不超过30个字符的前缀表达式,仅仅包括+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式说明:
输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。
例子输入与输出:
序号 | 输入 | 输出 |
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
代码例如以下:
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #include <stack>
- using namespace std;
- char s[47];
- stack<double>ss;
- int is_op(char c)
- {
- if(c=='+' || c=='-' || c=='*' || c=='/')
- return 1;
- return 0;
- }
- int main()
- {
- while(gets(s))
- {
- while(!ss.empty())//清空
- {
- ss.pop();
- }
- int len = strlen(s);
- int cc = 1;
- double tsum = 0;
- int flag = 0;//标记是否出现零作为除数的情况
- for(int i = len-1; i >= 0; i--)
- {
- if(s[i]>='0' && s[i]<='9')
- {
- tsum+=(s[i]-'0')*cc;
- cc*=10;
- }
- else if(s[i] == '.')//小数
- {
- tsum = tsum/(cc*1.0);
- cc = 1;
- }
- else if((s[i]=='+'||s[i]=='-') && tsum!=0)
- {
- if(s[i] == '+')
- {
- ss.push(tsum);
- i--;//跳过下一个空格
- continue;
- }
- else
- {
- tsum = -tsum;
- ss.push(tsum);
- i--;//跳过下一个空格
- continue;
- }
- }
- else if(s[i] == ' ')//当中一个运算数已经统计完
- {
- ss.push(tsum);
- tsum = 0;
- cc = 1;
- continue;
- }
- else if(is_op(s[i]))//假设是运算符
- {
- double a = ss.top();
- ss.pop();
- double b = ss.top();
- ss.pop();
- double tt = 0;
- if(s[i] == '+')
- tt = a+b;
- else if(s[i] == '-')
- tt = a-b;
- else if(s[i] == '*')
- tt = a*b;
- else if(s[i] == '/')
- {
- if(b == 0)
- {
- flag = 1;
- break;
- }
- tt = a/b;
- }
- ss.push(tt);
- i--;//跳过下一个空格
- }
- }
- /*int k = 0;//记录最后栈内还剩有的数字有多少个,有多个则ERROR
- int lenn = ss.size();
- double tt;
- for(int i = 0; i < lenn; i++)
- {
- tt = ss.top();
- ss.pop();
- if(!is_op(tt))
- {
- k++;
- }
- }
- if(flag != 1)
- printf("%.1lf\n",tt);*/
- if(flag != 1)
- printf("%.1lf\n",ss.top());
- else
- printf("ERROR\n");
- }
- return 0;
- }
3-07. 求前缀表达式的值(25) (ZJU_PAT数学)的更多相关文章
- PTA笔记 堆栈模拟队列+求前缀表达式的值
基础实验 3-2.5 堆栈模拟队列 (25 分) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Sta ...
- pat02-线性结构3. 求前缀表达式的值(25)
02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法 ...
- 【Zhejiang University PATest】02-3. 求前缀表达式的值
算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算 ...
- 信息竞赛进阶指南--递归法求中缀表达式的值,O(n^2)(模板)
// 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) { // 寻找未被任何括号包含的最后一个加减号 for (int i = r, j = 0; i >= ...
- openjduge 求简单表达式的值
表达式求值 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入 输入仅有一行 ...
- K:双栈法求算术表达式的值
相关介绍: 该算法用于求得一个字符串形式的表达式的结果.例如,计算1+1+(3-1)*3-(21-20)/2所得的表达式的值,该算法利用了两个栈来计算表达式的值,为此,称为双栈法,其实现简单且易于理 ...
- [LeetCode] Evaluate Division 求除法表达式的值
Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...
- [LeetCode] 399. Evaluate Division 求除法表达式的值
Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...
- 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
private static int fun(int m) { ; ; i <= m; i++) { == ) temp = temp + i; else temp = temp - i; } ...
随机推荐
- Linux进程笔记
进程及作业管理 Uninterruptible sleep: 不可中断的睡眠Interruptible sleep:可中断睡眠 kernel:init: COW: Copy On Write, 写时复 ...
- Cable master(好题,二分)
Cable master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- 系统开发中按下Enter键登录系统
转载来自:http://www.jb51.net/article/54308.htm 系统开发中按下Enter键登录系统,即就是监听键盘,当按下Enter键后调用登录按钮的click()事件. JS方 ...
- Jq合成事件绑定
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c# 数据库缓存依赖
1.为缓存依赖项启动通知数据库 在vs开发人员命令提示中运行(切换到aspnet_regsql.exe所在目录,示例目录:C:\Windows\Microsoft.NET\Framework64\v4 ...
- sql 事务和回滚
(1) set ANSI_NULLS ON --见图1 set QUOTED_IDENTIFIER ON go ALTER proc [dbo].[procname] as begin begin t ...
- [Effective Modern C++] Item 3. Understand decltype - 了解decltype
条款三 了解decltype 基础知识 提供一个变量或者表达式,decltype会返回其类型,但是返回的内容会使人感到奇怪. 以下是一些简单的推断类型: ; // decltype(i) -> ...
- arm str 指令
str 指令格式: str{条件} 1源寄存器 ,2存储器地址 eg: str r0,[r1],#8;将r0中的数值赋值给r1,然后在r1地址上+立即数8,再写入r1中: str r0,[r1,#8] ...
- 原生化:AnDevCon 2014 McVeigh 的主题演讲
作者:Jeff McVeigh(Intel) 基于(至少部分)NDK的原生安卓应用程序占现在前1000 强的 60% 以上.该增长的原因很简单:开发商需要为用户提供超卓的体验(包括灵敏的反应.与丰富的 ...