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

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

题目链接:

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

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long int64;
  5.  
  6. stack<int64> sn;
  7. stack<char> sc;
  8.  
  9. const int maxn = + ;
  10. char str[maxn];
  11.  
  12. char op[] = { '+', '-', '*', '/', '(', ')', '#' };
  13.  
  14. int getOpId(char op){
  15. if(op == '+')
  16. return -;
  17. else if(op == '-')
  18. return -;
  19. else if(op == '*')
  20. return -;
  21. else if(op == '/')
  22. return -;
  23. else if(op == '(' )
  24. return -;
  25. else if(op == ')' )
  26. return -;
  27. else if(op == '#')
  28. return -;
  29. else if(op == '&')
  30. return -;
  31. }
  32.  
  33. vector<int64> v;
  34.  
  35. int getPrio(char op){
  36. switch(op){
  37. case '+': return ;
  38. case '-': return ;
  39. case '*': return ;
  40. case '/': return ;
  41. case '(': return ;
  42. case '&': return ;
  43. default: return ;
  44. }
  45. }
  46.  
  47. int64 cal(int64 a, int64 b, char opt){
  48. if(opt == '+'){
  49. return a+b;
  50. }else if(opt == '-'){
  51. return a-b;
  52. }else if(opt == '*'){
  53. return a*b;
  54. }else if(opt == '/'){
  55. return a/b;
  56. }
  57. }
  58.  
  59. int main(void){
  60. scanf("%s", str);
  61. int len = strlen(str);
  62. str[len++] = '#';
  63.  
  64. for(int i = ; i < len; ++i){
  65. if('' <= str[i] && str[i] <= ''){
  66. int64 t = ;
  67. while('' <= str[i] && str[i] <= ''){
  68. t = t * + (str[i] - '');
  69. i++;
  70. }
  71. i--;
  72. v.push_back(t);
  73. }else{
  74. v.push_back(getOpId(str[i]));
  75. }
  76. //cout << v.back() << " ";
  77. }
  78. //cout << endl;
  79.  
  80. int sz = v.size();
  81. sc.push('&');
  82. for(int i = ; i < sz; ++i){
  83. if(v[i] >= ){
  84. sn.push(v[i]);
  85. //cout << "push " << v[i] << endl;
  86. }else{
  87. char c = op[-v[i]-];
  88. if(c == '('){
  89. sc.push('(');
  90. //cout << "push " << '(' << endl;
  91. }else if(c == ')'){
  92. while(sc.top() != '('){
  93. int64 b = sn.top(); sn.pop();
  94. int64 a = sn.top(); sn.pop();
  95. char opt = sc.top(); sc.pop();
  96. sn.push(cal(a, b, opt));
  97. //cout << "cal " << a << " " << opt << " " << b << endl;
  98. }
  99. sc.pop();
  100. //cout << "pop " << '(' << endl;
  101. }else{
  102. int prio1 = getPrio(c);
  103. int prio2;
  104.  
  105. while(prio1 <= (prio2 = getPrio(sc.top()))){
  106. //cout << "prio1: " << prio1 << " prio2: " << prio2 << endl;
  107. int64 b = sn.top(); sn.pop();
  108. int64 a = sn.top(); sn.pop();
  109. char opt = sc.top(); sc.pop();
  110. sn.push(cal(a, b, opt));
  111. //cout << "cal " << a << " " << opt << " " << b << endl;
  112. }
  113. sc.push(c);
  114. //cout << "push " << c << endl;
  115. }
  116. }
  117. }
  118.  
  119. //cout << "haha" << endl;
  120. printf("%lld\n", sn.top());
  121.  
  122. return ;
  123. }
  124.  
  125. /**
  126. 5*(3+8*2)-(5+6*2-7)*2
  127. 100*(2+12)-(20/3)*2
  128. (8+2*3/4-4)*(3-2+5/2*3)*(3-4+3)/6
  129. */

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. dos2unix xxx.sh

    前几天写了一个Linux的自动化脚本,没有使用变量,就是一些Linux命令的集合 今天试着把一些相同的字段提出来用变量表示,然后在Linux里运行,就发现一直在报错: : command not fo ...

  2. 【sqli-labs】 less47 GET -Error based -String -Order By Clause(GET型基于错误的字符型Order By从句注入)

    http://192.168.136.128/sqli-labs-master/Less-47/?sort=1 改变sort的值,结果仍然是order by 1的结果 http://192.168.1 ...

  3. What is gradle sync in Android Studio?

    What is it? And what does it do? Gradle sync is a gradle task that looks through all of your depende ...

  4. js的StringBuffer类

    function StringBuffer(str){ var arr = []; str = str || ""; arr.push(str); this.append = fu ...

  5. 原型链、构造函数、箭头函数、se6数组去重

    原型链 例子如下: var arr = [1, 2, 3]; 其原型链为:arr ----> Array.prototype ----> Object.prototype ----> ...

  6. 51nod1006 -最长公共子序列Lcs【动态规划】

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  7. trycatch中return语句如何执行

    测试代码如下: package reviewTest; /** * @ClassName: ReturnTest * @Description: 测试return在trycatch中的执行 * @au ...

  8. C#学习笔记_09_构造方法/函数

    09_构造方法/函数 代码案例 作用:构造函数主要是用来创建对象时为对象赋初值来初始化对象:总与new运算符一起使用在创建对象的语句中,例如A a=new A(); 特点: 构造函数具有和类一样的名称 ...

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

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

  10. 2017 Multi-University Training Contest - Team 4 Classic Quotation

    Classic Quotation Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Othe ...