问题描述

小 V 发明了一个神奇的整数计算器:
给定一个合法的表达式,这个计算器能求出这个表达式的最终答案。
表达式可能包含:
+:运算符,整数加法。如 1+1=2
-:运算符,整数减法。如 1-1=0
*:运算符,整数乘法。如 1*1=1
/:运算符,整数除法。如 3/2=1
(:左括号
):右括号
操作数:保证为非负整数,且操作数没有正号(如不会出现+1 等)
现在,给定一个表达式,小 V 在用这个计算器计算前想先知道最终答案是多少,你能
帮帮他吗?

★数据输入
一个合法的表达式,表达式长度不超过 1000。

★数据输出
表达式的最终结果。

★Notice
题目保证:输入的操作数,计算的中间值,计算的最终结果都在 int 范围内

★样例

1+1    2

1+2/3   1

(1+2)*3   9

解题思路

  solve1

    建立两个栈:数字栈、符号栈

    按顺序遍历算式

    遇到数字注意按多位数读取,压入数字栈

    若符号栈为空或为 ' ( ' ,压入符号栈

    遇到 + - / *,向前计算优先级大于等于本符号优先级的,算到 ' ( '停止。将本符号压入符号栈

    优先级 / * 最高,+ - 次之

    故 + - 前面的 + - * / 都要算, * / 前面的* / 要算, + -不算,遇到 + - 停止

    遇到 ' ) ',向前算到 ' ( '

    最后数字栈栈顶元素即为解

  solve 2

    将原表达式转换为后续表达式。

    为能正确读取后续表达式,可在所有数字、符号间加上空格。

    此时,表达式将比原表达式长,原来长度1000数组不够用,要开大一点

    最后用后续表达式计算结果

  附:中缀表达式转后缀表达式的方法

    1.遇到操作数:直接输出(添加到后缀表达式中)
    2.栈为空时,遇到运算符,直接入栈
    3.遇到左括号:将其入栈
    4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
    5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
    6.最终将栈中的元素依次出栈,输出。

code

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. #include <stack>
  5. #include <string.h>
  6.  
  7. inline bool isNum(char c)
  8. {
  9. return c>='' && c<='';
  10. }
  11.  
  12. inline int toInt(char c)
  13. {
  14. return c-'';
  15. }
  16.  
  17. int calc(int nl,int nr,char s)
  18. {
  19. if(s=='+') return nl+nr;
  20. else if(s=='-') return nl-nr;
  21. else if(s=='*') return nl*nr;
  22. else if(s=='/') return nl/nr;
  23. printf("errror");
  24. return ;
  25. }
  26.  
  27. int main()
  28. {
  29. int i,j,k;
  30. char str[]={};
  31. int len;
  32. scanf("%s",str);
  33. len = strlen(str);
  34.  
  35. stack<int> num;
  36. stack<int> signal;
  37.  
  38. for(i=;i<len;i++)
  39. {
  40. if(isNum(str[i]))
  41. {
  42. int n = toInt(str[i]);
  43. for (j = i + ; j < len && isNum(str[j]); j++)
  44. n = n * + toInt(str[j]);
  45. num.push(n);
  46. i = j - ;
  47. }
  48. else // is signal
  49. {
  50. char thissign = str[i];
  51. if(thissign=='(' || signal.empty())
  52. {
  53. signal.push(thissign);
  54. }
  55. else if(thissign=='+' || thissign=='-')
  56. {
  57. while(!signal.empty() && signal.top()!='(')
  58. {
  59. int nr = num.top();
  60. num.pop();
  61. int nl = num.top();
  62. num.pop();
  63. num.push(calc(nl,nr,signal.top()));
  64. signal.pop();
  65. }
  66. signal.push(thissign);
  67. }
  68. else if(thissign=='*' || thissign=='/')
  69. {
  70. while(!signal.empty() && ( signal.top()=='*' || signal.top()=='/') )
  71. {
  72. int nr = num.top();
  73. num.pop();
  74. int nl = num.top();
  75. num.pop();
  76. num.push(calc(nl,nr,signal.top()));
  77. signal.pop();
  78. }
  79. signal.push(thissign);
  80. }
  81. else if(thissign==')')
  82. {
  83. while(!signal.empty() && signal.top()!='(')
  84. {
  85. int nr = num.top();
  86. num.pop();
  87. int nl = num.top();
  88. num.pop();
  89. num.push(calc(nl,nr,signal.top()));
  90. signal.pop();
  91. }
  92. signal.pop();
  93. }
  94. }
  95. }
  96. while(!signal.empty())
  97. {
  98. int nr = num.top();
  99. num.pop();
  100. int nl = num.top();
  101. num.pop();
  102. num.push(calc(nl,nr,signal.top()));
  103. signal.pop();
  104. }
  105. printf("%d\n",num.top());
  106. return ;
  107. }

数据结构_calculator的更多相关文章

  1. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  2. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  3. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  4. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  5. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  6. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  7. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  8. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

随机推荐

  1. 使用Visio画UML模型

    Microsoft Office Visio“UML 模型图” 模板为创建复杂软件系统的面向对象的模型 (模型:建模系统的一种抽象表示,它从特定的视角并在某一抽象级别上指定建模系统.) 提供全面的支持 ...

  2. 如何安装Microsoft Visual C++6.0

    Microsoft Visual C++6.0作为新手C语言编程软件,被大家广为使用,然而许多人为拷贝来的C++6.0安装包如何安装感到苦恼,因此许多同学都是以安装失败,安装不成 功而告终.接下来我就 ...

  3. 要做Java程序员 需要知道那些技术 重点有那些

    一.Java程序员         高级特性               反射.泛型.注释符.自动装箱和拆箱.枚举类.可变               参数.可变返回类型.增强循环.静态导入     ...

  4. python中读写LMDB数据库

    LMDB的全称是Lightning Memory-Mapped Database(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件: LMDB文件可以同时由多个进程打开,具有 ...

  5. python_广州房价热力图

    调用百度地图api,获取经纬度数据,然后在调用百度地图api,生成热力图 import pandas as pd import numpy as np data = pd.read_excel(r'D ...

  6. swing之borderlayout

    import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; //1.继承 JFrame类 ...

  7. bzoj 3027 [Ceoi2004]Sweet——生成函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 化式子到 ( \mul_{i=1}^{n}(1-x^(m[i]+1)) ) / (1- ...

  8. 四、Jmeter--参数化

    一.CSV 参数化 1.我们做性能测试需要并发多个用户,为了真实模拟用户行为,我们需要模拟多个不同的用户登录,这是我们就需要进行参数化.这里我们选择比较常用的参数化方法-CSV Data Set Co ...

  9. electron 安装失败解决办法

    1.安装node https://nodejs.org/en/download/2.安装镜像工具npm install -g cnpm --registry=https://registry.npm. ...

  10. debian7.2+nginx+mysql

    1.安装mysql sudo aptitude install mysql-server netstat -atln 查看3306端口 数据库目录: /var/lib/mysql/ 配置文件/usr/ ...