数据结构的入门题,理解倒是不复杂,用两个栈就行(一个存数字一个存符号)。对于我这样的弱弱没事练练编码能力还是不错的。

注意运算优先级即可。(过两天回科大了,下次再做题也不知道何时,ACM生涯两铜收场orz)

题目链接:

http://hihocoder.com/contest/hihointerview11/problem/3

代码:

 #include <bits/stdc++.h>

 using namespace std;
typedef long long int64; stack<int64> sn;
stack<char> sc; const int maxn = + ;
char str[maxn]; char op[] = { '+', '-', '*', '/', '(', ')', '#' }; int getOpId(char op){
if(op == '+')
return -;
else if(op == '-')
return -;
else if(op == '*')
return -;
else if(op == '/')
return -;
else if(op == '(' )
return -;
else if(op == ')' )
return -;
else if(op == '#')
return -;
else if(op == '&')
return -;
} vector<int64> v; int getPrio(char op){
switch(op){
case '+': return ;
case '-': return ;
case '*': return ;
case '/': return ;
case '(': return ;
case '&': return ;
default: return ;
}
} int64 cal(int64 a, int64 b, char opt){
if(opt == '+'){
return a+b;
}else if(opt == '-'){
return a-b;
}else if(opt == '*'){
return a*b;
}else if(opt == '/'){
return a/b;
}
} int main(void){
scanf("%s", str);
int len = strlen(str);
str[len++] = '#'; for(int i = ; i < len; ++i){
if('' <= str[i] && str[i] <= ''){
int64 t = ;
while('' <= str[i] && str[i] <= ''){
t = t * + (str[i] - '');
i++;
}
i--;
v.push_back(t);
}else{
v.push_back(getOpId(str[i]));
}
//cout << v.back() << " ";
}
//cout << endl; int sz = v.size();
sc.push('&');
for(int i = ; i < sz; ++i){
if(v[i] >= ){
sn.push(v[i]);
//cout << "push " << v[i] << endl;
}else{
char c = op[-v[i]-];
if(c == '('){
sc.push('(');
//cout << "push " << '(' << endl;
}else if(c == ')'){
while(sc.top() != '('){
int64 b = sn.top(); sn.pop();
int64 a = sn.top(); sn.pop();
char opt = sc.top(); sc.pop();
sn.push(cal(a, b, opt));
//cout << "cal " << a << " " << opt << " " << b << endl;
}
sc.pop();
//cout << "pop " << '(' << endl;
}else{
int prio1 = getPrio(c);
int prio2; while(prio1 <= (prio2 = getPrio(sc.top()))){
//cout << "prio1: " << prio1 << " prio2: " << prio2 << endl;
int64 b = sn.top(); sn.pop();
int64 a = sn.top(); sn.pop();
char opt = sc.top(); sc.pop();
sn.push(cal(a, b, opt));
//cout << "cal " << a << " " << opt << " " << b << endl;
}
sc.push(c);
//cout << "push " << c << endl;
}
}
} //cout << "haha" << endl;
printf("%lld\n", sn.top()); return ;
} /**
5*(3+8*2)-(5+6*2-7)*2
100*(2+12)-(20/3)*2
(8+2*3/4-4)*(3-2+5/2*3)*(3-4+3)/6
*/

hihoCoder 简单计算器的更多相关文章

  1. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  2. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  3. PAT 06-1 简单计算器

    想看一般简单计算器实现的看客不好意思了,这不是你想要点东西,此处题设为“只能进行加减乘除”.“都是整数”.”优先级相同“和"从左到右".此题来自PAT(http://www.pat ...

  4. php大力力 [005节] php大力力简单计算器001

    2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ...

  5. PHP实现简单计算器

    <!--简单的计算器--> <!DOCTYPE html> <html> <head> <title>PHP实现简单计算器</titl ...

  6. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

  7. JavaWeb学习记录(二十)——Model1模式(javaBean+jsp)实现简单计算器案例

    ¨JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为: ¨<jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件. ¨< ...

  8. 一个用WPF做的简单计算器源代码

    一.界面设计XAML代码 <Window x:Class="fengjisuanqi.MainWindow" xmlns="http://schemas.micro ...

  9. hdu 1237 简单计算器

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...

随机推荐

  1. Map 键值对 set get delete

  2. Java切换JDK版本的方法及技巧

    由于项目的不同安排,之前项目开发时,使用的jdk版本为1.8,现临时接手一以前项目,需要更换jdk版本. 安装 不再赘述,去Oracle网站(https://www.oracle.com/techne ...

  3. adjtimex和时钟的几个概念tick,freq,ppm,jiffies

    adjtimex使用 今天遇到一个ntp的同步问题.服务器上配置好了ntpd,在启动前也手动进行过同步,但是过段时间ntpq查询发现服务器即便能选出同步服务器,但是系统的时间偏差越来越大. 服务器上实 ...

  4. [luogu2154 SDOI2009] 虔诚的墓主人(树状数组+组合数)

    传送门 Solution 显然每个点的权值可以由当前点上下左右的树的数量用组合数\(O(1)\)求出,但这样枚举会T 那么我们考虑一段连续区间,对于一行中两个常青树中间的部分左右树的数量一定,我们可用 ...

  5. JDK5-8特性归纳

    jdk5新特性1.自动装箱和拆箱2.枚举3.静态导入4.可变参数5.內省   是Java语言对Bean类属性.事件的一种缺省处理方法.例如类A中有属性那么,那我们可以通过getName,setName ...

  6. centOS防火墙

    默认防火墙firewall #停止firewall systemcl stop firewall.service #禁止firewall开机启动 systemctl disable firewall. ...

  7. 从CSV文件中读取jpg图片的URL地址并多线程批量下载

    很多时候,我们的网站上传图片时并没有根据内容进行文件夹分类,甚至会直接存储到阿里云的OSS或是七牛云等云存储上.这样,当我们需要打包图片时,就需要从数据库找寻分类图片,通过CURL进行下载.我最近刚刚 ...

  8. hadoop-hdp-ambari离线安装记录

    一.系统准备 1. 创建user——ambari 2.关闭防火墙 redhat6: chkconfig iptables off /etc/init.d/iptables stop redhat7: ...

  9. Office 2003的卸载 与 Office 2013 的安装

    一.Office 2003的卸载 软件:卸载Office2003.msi 运行该软件,等待几分钟即可, 二.Office 2013 的安装 1.Office Professional Plus 201 ...

  10. ESXi License过期解决办法

    http://blog.sina.com.cn/s/blog_538439270101pqls.html