hihoCoder 简单计算器
数据结构的入门题,理解倒是不复杂,用两个栈就行(一个存数字一个存符号)。对于我这样的弱弱没事练练编码能力还是不错的。
注意运算优先级即可。(过两天回科大了,下次再做题也不知道何时,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.C#WinForm基础制作简单计算器
利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...
- 菜鸟学Android编程——简单计算器《一》
菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...
- PAT 06-1 简单计算器
想看一般简单计算器实现的看客不好意思了,这不是你想要点东西,此处题设为“只能进行加减乘除”.“都是整数”.”优先级相同“和"从左到右".此题来自PAT(http://www.pat ...
- php大力力 [005节] php大力力简单计算器001
2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ...
- PHP实现简单计算器
<!--简单的计算器--> <!DOCTYPE html> <html> <head> <title>PHP实现简单计算器</titl ...
- c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;
网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...
- JavaWeb学习记录(二十)——Model1模式(javaBean+jsp)实现简单计算器案例
¨JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为: ¨<jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件. ¨< ...
- 一个用WPF做的简单计算器源代码
一.界面设计XAML代码 <Window x:Class="fengjisuanqi.MainWindow" xmlns="http://schemas.micro ...
- hdu 1237 简单计算器
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...
随机推荐
- OpenCV3 Java 机器学习使用方法汇总
原文链接:OpenCV3 Java 机器学习使用方法汇总 前言 按道理来说,C++版本的OpenCV训练的版本XML文件,在java中可以无缝使用.但要注意OpenCV本身的版本问题.从2.4 到3 ...
- (Entity framework 应用篇)把权限判断封装在数据库访问层
这里,我只是以一个例子,说一下简单权限控制,通过这个例子,大家可以设计庞大的权限管理层,把权限控制封装到数据库访问层,这样程序员就不用再写权限判断的代码了 首先,先看看我数据库DBContext的定义 ...
- parseInt()函数
parseInt()转化整形是从左往右,取出第一个整型,如:10a10b,则显示10: //20170719补充 如果该字符串第一个字符是0,那么该字符串会基于八进制而非十进制来求值,在八进制中,8和 ...
- Python学习【第3篇】:Python之运算符
一.运算符 计算机可以进行的运算有很多种,不只是加减乘除,它和我们人脑一样,也可以做很多运算. 种类:算术运算,比较运算,逻辑运算,赋值运算,成员运算,身份运算,位运算,今天我们先了解前四个. 算术运 ...
- char如何储存3个字节或者4个字节
1.char字符存储的是Unicode编码的代码点,也就是存储的是U+FF00这样的数值,然而我们在调试或者输出到输出流的时候,是JVM或者开发工具按照代码点对应的编码字符输出的. 2. 所以虽然UT ...
- web前端学习总结--JQuery
jQuery 什么是jQuery jQuery是一个优秀的JavaScript框架,一个轻量级的JS库. 它封装了JS.CSS.DOM,提供了一致的.简洁的API. 兼容CSS3,及各种浏览器 使用户 ...
- Linux常用shell命令持续总结
1. 查看端口运行 netstat -lnp|grep 80 2. 定时任务 Crontab -e 编辑任务 Crontab -l 查看当前任务列表 /var/log/cron-* 任务日志
- HTML学习笔记之HTML5新特性
目录 1.拖放 2.画布 3.可伸缩矢量图形 4.地理定位 5.Web 存储 6.应用缓存 7.Web Worker 1.拖放 拖放是一种常见的特性,用于抓取对象以后拖到另一个位置,它是 HTML5 ...
- python爬虫12 | 爸爸,他使坏,用动态的 Json 数据,我要怎么搞?
在前面我们玩了好多静态的 HTML 想必你应该知道怎么去爬这些数据了 但还有一些常见的动态数据 比如 商品的评论数据 实时的直播弹幕 岛国动作片的评分 等等 这些数据是会经常发生改变的 很多网站就会用 ...
- 《零压力学Python》 之 第一章知识点归纳
第一章(初识Python)知识点归纳 Python是从ABC语言衍生而来的 ABC语言是Guido参与设计的一种教学语言,为非专业编程人员所开发的. Python是荷兰程序员 Guido Van Ro ...