计算(信息学奥赛一本通-T1356)
【题目描述】
小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)
【输入】
共1行,为一个算式。
【输出】
共1行,就是密码。
【输入样例】
1+(3+2)*(7^2+6*9)/(2)
【输出样例】
258
【源程序】
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-9
#define INF 0x3f3f3f3f
#define LL long long
const int MOD=1000000007;
const int N=10000+5;
const int dx[]= {-1,1,0,0};
const int dy[]= {0,0,-1,1};
using namespace std;int n,m;
stack<int> s1;//操作数栈
stack<char> s2;//运算符栈int lev(char x)//运算符优先级
{if(x=='+'||x=='-')return 1;if(x=='*'||x=='/')return 2;if(x=='^')return 3;return 0;
}void calculate(stack<int> &s1,stack<char> &s2)//弹出栈顶元素并计算
{/*取出后弹出栈*/int y=s1.top();s1.pop();int x=s1.top();s1.pop();char z=s2.top();s2.pop();/*根据运算符计算,并压入栈*/if(z=='+')s1.push(x+y);if(z=='-')s1.push(x-y);if(z=='*')s1.push(x*y);if(z=='/')s1.push(x/y);if(z=='^')s1.push(pow(x,y));
}int c(int x)
{return x!=0;
}
char str[1000000];
int sum[1000000];int main(){scanf("%s",str+1);n=strlen(str+1);for(int i=1;i<=n;i++)//检查匹配{sum[i]+=sum[i-1];if(str[i]=='(')sum[i]++;if(str[i]==')')sum[i]--;}bool out=false;for(int i=2;i<=n;i++)if( c(lev(str[i])) && c(lev(str[i-1])) ){out=1;break;}if( ( n==1 && c(lev(str[1])) )||sum[n]||out )//表达式不合法{cout<<"NO"<<endl;return 0;}stack<int> s1;stack<char> s2;int temp=0;bool flag=false;for(int i=1;i<=n;i++){if('0'<=str[i]&&str[i]<='9')//判断当前字符是否为数字{temp=(temp<<3)+(temp<<1)+str[i]-'0';flag=true;}else{if(flag){s1.push(temp);temp=0;flag=false;}if(str[i]=='('){s2.push(str[i]);continue;}if(str[i]==')'){while(s2.top()!='(')calculate(s1,s2);s2.pop();continue;}while(!s2.empty()&&lev(s2.top())>=lev(str[i]))//优先级判断calculate(s1,s2);s2.push(str[i]);//运算符入栈}}if(flag){s1.push(temp);temp=0;flag=false;}while(!s2.empty())calculate(s1,s2);cout<<s1.top()<<endl;return 0;
}
计算(信息学奥赛一本通-T1356)相关推荐
- 信息学奥赛一本通 1356:计算(calc)
[题目链接] ybt 1356:计算(calc) [题目考点] 1. 表达式求值 中缀表达式求值 2. 表达式树 表达式树:一棵表达式树可以表示一系列的运算. 表达式树中的结点包括运算符与数值 str ...
- 信息学奥赛一本通——1012:计算多项式的值
大家好 今天给大家带来<信息学奥赛一本通--1012:计算多项式的值> 看题目: 1012:计算多项式的值 时间限制: 1000 ms 内存限制: 65536 KB 提交数 ...
- 信息学奥赛一本通 (C++)上机练习
信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...
- 《信息学奥赛一本通提高篇》第6章 组合数学
例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 【例8】合唱队形(《信息学奥赛一本通第五版》)
/* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...
- 信息学奥赛一本通 1358:中缀表达式值(expr)
[题目链接] ybt 1358:中缀表达式值(expr) [题目考点] 1. 表达式求值 中缀表达式转后缀表达式 后缀表达式求值 [解题思路] 由于题目要求做中缀表达式转为后缀表达式,而后求值.那么这 ...
- Knight Moves(信息学奥赛一本通-T1450)
[题目描述] 编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数.骑士一步可以移动到的位置由下图给出. [输入] 第一行给出骑士的数量 n. 在接下来的 3n 行中,每 3 行描述 ...
- 信息学奥赛一本通——2062:【例1.3】电影票
2062:[例1.3]电影票 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 57341 通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...
最新文章
- 发那科机器人控制柜示教器不通电_分享ABB机器人控制柜和本体的接线,给刚入门机器人的新人...
- 图灵八月书讯 ——技术图书嘉年华
- simple-spring-memcached统一缓存的使用实例4
- java微信oppo,OPPO实现全球首次5G微信视频通话,国产手机满分操作
- java读取frp_【原创】FRP初探(函数式编程部分)
- 机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器
- linux 目录命令_Linux目录命令能力问题和解答
- win7系统出现蓝屏0x0000003b怎么解决
- linux下使用fdisk命令进行硬盘分区
- win8安装wampserver报403错误解决方法
- Git 与 GitHub
- 【推荐】数据治理资料合集
- Unity3D中玻璃、金属材质制作
- 鹏鹏:python 机器学习初学者 三剑客介绍。
- JavaCore-ClassLoader
- Nginx配置虚拟主机三种方式
- 华晨宏盛:只需建立正确的理财观,把握科学的理财办法
- HTML/CSS布局—Flex布局(弹性布局)
- [ 电子]STM32驱动28BYJ-48步进电机实现外网控制
- javascript兼容性