hiho #1332 : 简单计算器 栈+递归
#1332 : 简单计算器
描述
编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整。)
例如计算 100 * ( 2 + 12 ) - (20 / 3) * 2, 结果是1388。
输入
一个长度不超过100的字符串,代表要计算的算式。包含数字0-9以及+-*/()。
输入保证计算过程不会超过32位有符号整数,并且其中的'-'都是减号没有负号。
输出
计算的结果。
- 样例输入
-
100*(2+12)-(20/3)*2
- 样例输出
-
1388 思路:栈模拟,因为有个括号,所以需要重复调用自身,写个函数;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define esp 1e-10
const int N=1e5+,M=1e6+,mod=1e9+,inf=1e9+;
char a[M];
ll getnum(char *a,ll lenn)
{
stack<char>s;
stack<ll>num;
ll x=lenn;
ll pos=;
ll n=;
ll ans=;
if(a[pos]=='(')
{
ll en;
ll flag=;
for(ll j=pos+;;j++)
{
if(a[j]=='(')
flag++;
if(a[j]==')')
{
if(flag==)
{en=j;
break;
}
else
flag--;
}
}
ll len=en-pos-;
num.push(getnum(a+pos+,len));
pos=en+;
}
else
{
for(pos=; pos<x&&a[pos]>=''&&a[pos]<=''; pos++)
{
n*=;
n+=a[pos]-'';
}
num.push(n);
}
while(pos<x)
{
s.push(a[pos++]);
if(a[pos]=='(')
{
ll en;
ll flag=;
for(ll j=pos+;;j++)
{
if(a[j]=='(')
flag++;
if(a[j]==')')
{
if(flag==)
{
en=j;
break;
}
else
flag--;
}
}
ll len=en-pos-;
n=getnum(a+pos+,len);
pos=en+;
}
else
{
n=;
while(pos<x&&a[pos]>=''&&a[pos]<='')
{
n*=;
n+=a[pos]-'';
pos++;
}
}
if(s.top()=='*')
{
ll k=num.top();
num.pop();
num.push(n*k);
s.pop();
}
else if(s.top()=='/')
{
ll k=num.top();
num.pop();
if(n!=)
num.push(k/n);
else
num.push(n);
s.pop();
}
else
num.push(n);
}
while(!s.empty())
{
if(s.top()=='+')
ans+=num.top();
else if(s.top()=='-')
ans-=num.top();
num.pop();
s.pop();
}
return ans+num.top();
}
int main()
{
ll x,y,z,i,t;
scanf("%s",a);
printf("%lld\n",getnum(a,strlen(a)));
return ;
}
// (1-2*3)/(2*3+(0-1))
hiho #1332 : 简单计算器 栈+递归的更多相关文章
- F - 简单计算器(栈)
F - 简单计算器 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descripti ...
- hdu-1237简单计算器(栈的运用)
http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...
- HDU1237 简单计算器 栈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...
- HDU 1237 简单计算器 栈
额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...
- hdu 1237 简单计算器(栈处理)
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDU1237 简单计算器 【栈】+【逆波兰式】
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu1237 简单计算器[STL 栈]
目录 题目地址 题干 代码和解释 参考 题目地址 hdu1237 题干 代码和解释 解本题时使用了STL 栈,要记得使用#include<stack>. 解本题时使用了isdigit()函 ...
- C语言,简单计算器【上】
由于工作需要最近在研究PHP扩展,无可避免的涉及到了C语言.从出了学校以后C语言在实际工作中还没有用到过,所以必须要先进行一点复习工作.个人认为对于熟悉一样东西说最好的方法是上手实践.于是便想起了当时 ...
- hdoj 1237 简单计算器
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
随机推荐
- 响应式设计Responsinator工具推荐
from:http://www.25xt.com/allcode/4066.html 原文推荐了5种,感觉有用的吧就这一种,所以收藏过来. Responsinator工具的好处Responsinato ...
- SQL Server 锁表说明
锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其 ...
- SQL Server优化
虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决. 查询速度慢的原因很多,常见如下几种: 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) I/ ...
- load d3dcompiler_46.dll failed
https://gist.github.com/rygorous/7936047 编shader的时候遇到这个warning不知道是不是什么隐患..从今天开始要做新项目了 尝试从同事那里要了这dll ...
- 女性社区TOP10
“女性和孩子的钱是世界上最好赚的”并不是一句空话.据统计,女性掌管着家庭70%的支出,如果你能让女性为你掏出腰包,那么你基本就掌控了一个家庭的大部分的消费. 有趣的是,女性还是一个喜欢分享的群体,他们 ...
- 手写PE文件(二)
[文章标题]: 纯手工编写的PE可执行程序 [文章作者]: Kinney [作者邮箱]: mohen_ng@sina.cn [下载地址]: 自己搜索下载 [使用工具]: C32 [操作平台]: win ...
- BZOJ: 1084: [SCOI2005]最大子矩阵
NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1228 Solved: 622[Submit][Stat ...
- 一道PK赛题
Problem Description I think that you might have played the traditional Chinese ring game: The Chines ...
- Notepad++ 几款实用插件简介,让你的 Notepad++ 如虎添翼
Notepad++ 是一款非常优秀的文本编辑器,非常适合编辑源代码.Notepad++ 安装时已经附带有 Compare 等优秀插件,通过其 Plugin Manager 可以下载更多实用插件. 一. ...
- Chapter 5
1. 2模块导入 3.包导入