#1332 : 简单计算器

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向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 : 简单计算器 栈+递归的更多相关文章

  1. F - 简单计算器(栈)

    F - 简单计算器 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descripti ...

  2. hdu-1237简单计算器(栈的运用)

    http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...

  3. HDU1237 简单计算器 栈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...

  4. HDU 1237 简单计算器 栈

    额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...

  5. hdu 1237 简单计算器(栈处理)

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. HDU1237 简单计算器 【栈】+【逆波兰式】

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. hdu1237 简单计算器[STL 栈]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu1237 题干 代码和解释 解本题时使用了STL 栈,要记得使用#include<stack>. 解本题时使用了isdigit()函 ...

  8. C语言,简单计算器【上】

    由于工作需要最近在研究PHP扩展,无可避免的涉及到了C语言.从出了学校以后C语言在实际工作中还没有用到过,所以必须要先进行一点复习工作.个人认为对于熟悉一样东西说最好的方法是上手实践.于是便想起了当时 ...

  9. hdoj 1237 简单计算器

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. WARNING: Calls to any function that may require a gradient calculation inside a conditional block may return undefined results

    GLES2.0: Some device will give a warning on compling shaders(yet the compling will succeed), and the ...

  2. UML类图(转载)

    概述: 类图是静态图.它代表了一个应用程序的静态视图.类图不仅用于可视化描述和记录系统的不同方面,但也为构建可执行代码的软件应用程序. 类图描述一类的属性和操作,也对系统的约束.被广泛应用于类图的建模 ...

  3. ASP.NET 大文件上传的简单处理

    在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...

  4. HDU4916 Count on the path(树dp??)

    这道题的题意其实有点略晦涩,定义f(a,b)为 minimum of vertices not on the path between vertices a and b. 其实它加一个minimum ...

  5. HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

    题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...

  6. ***ECharts图表入门和最佳实践

    ECharts数据图表系统? 5分钟上手! [ECharts简介] ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动, ...

  7. Eclipse Java EE 编译器设置JSP默认编码

    在windows-preferences-web-jsp files-encoding那里设置默认编码.如下图所示:

  8. http://www.cnblogs.com/leiOOlei/p/5075402.html

    http://www.cnblogs.com/leiOOlei/p/5075402.html

  9. 多页面打印--web print

    背景:项目中要求做在一个页面中通过选择网址来打印多个页面的内容的功能 原理:通过iframe把各网址的页面内容加载进来,通过iframe.contentWindow拿到iframe的window对象, ...

  10. Android核心分析之二十七Android GDI 之SurfaceFlinger之动态结构示

           SurfaceFlinger对象建立过程示意 1 SurfaceSession的建立 客户端请求建立Surface时,首先在要与SurfaceFlinger建立一个Session,然后再 ...