问题描述:

题目要求我们实现一个简单的加减计算器,计算一个表达式的值,表达式除了数字之外还可能会含有括号,加减符号以及空格。

思路:

其实看到这个题自然就会想到利用后缀式求表达式值的算法作业题,况且这个题还没有乘法除法运算,我就沿用了做算法作业题的思路来求解:

1.由原表达式求出后缀式

2.根据后缀式求值

当然,这个题由于没有乘除法,不需要考虑运算符的优先性而只需要考虑括号的分隔作用,相比于算法作业有很多地方可以简化:比如新的一个运算符号遇到栈顶符号时可以直接拿出栈顶符号,又比如在栈里在'('之上的至多只有一个符号。

具体解决方案:

1.利用一个char逐个读取string s里的字符,并作判断,若为空格不做操作;

2.利用一个字符栈进行后缀式求解,左扩号直接进栈;加减符号若遇栈顶同为加减号则退出栈顶符号加到后缀式,新符号进栈;右括号若遇栈顶为左括号则直接把左括号退出栈顶,否则退出运算符加入后缀式,再退出左括号;

3.数与数之间用'$'分隔开以便后缀式的计算,例:"$13$24";

4.用一个<int>栈计算后缀式的值,读取到表达式里面的数值则存入栈,遇到符号则对栈顶和栈顶下一位的数值进行相应的计算并把结果存在栈顶;

5.返回栈顶数值。

相应的代码:

 class Solution {
public:
int calculate(string s) {
stack<char> operation;
stack<int> numCan;
string newExp, temNumExp;
char temsave;
int temTop, temNum;
bool isNextNum = true;
istringstream iss;
for(int i = ;i < s.size();i++)//求得后缀式
{
temsave = s[i];
if(temsave != ' ')
{
if(temsave >= '' && temsave <= '')
{
if(isNextNum == true)
{
newExp += '$';//$分隔两个数
newExp += temsave;
isNextNum = false;
}
else
newExp += temsave;
}
else
{
isNextNum = true;
if(temsave == '+' || temsave == '-')
{
if(operation.empty() == true || operation.top() == '(')
operation.push(temsave);
else
{
newExp += operation.top();
operation.pop();
operation.push(temsave);
}
}
else if(temsave == '(')
operation.push(temsave);
else
{
if(operation.top() != '(')
{
newExp += operation.top();
operation.pop();
operation.pop();
}
else
operation.pop();
}
}
}
}
if(operation.empty() == false)
newExp += operation.top();
for(int i = ;i < newExp.size();i++)//计算后缀式
{
temsave = newExp[i];
if(temsave == '+' || temsave == '-')
{
temTop = numCan.top();
numCan.pop();
if(temsave == '+')
numCan.top() += temTop;
else
numCan.top() -= temTop;
}
else if(temsave == '$')
{
i++;
iss.clear();
while(newExp[i] != '+' && newExp[i] != '-' && newExp[i] != '$' && i < newExp.size())
{
temNumExp += newExp[i];
i++;
}
i--;
iss.str(temNumExp);
iss >> temNum;
numCan.push(temNum);
temNumExp = "";
}
}
return numCan.top();
}
};

运行结果:

时间好长╮(╯▽╰)╭,然而没有时间改进了……

支线任务2-Basic Calculator的更多相关文章

  1. 数据结构与算法(1)支线任务2——Basic Calculator

    题目:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a simple ...

  2. [LeetCode] Basic Calculator II 基本计算器之二

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  3. [LeetCode] Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  4. Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  5. Basic Calculator

    本博客介绍leetcode上的一道不难,但是比较经典的算法题. 题目如下: Implement a basic calculator to evaluate a simple expression s ...

  6. LeetCode#227.Basic Calculator II

    题目 Implement a basic calculator to evaluate a simple expression string. The expression string contai ...

  7. Java for LeetCode 227 Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  8. Java for LeetCode 224 Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  9. LeetCode Basic Calculator II

    原题链接在这里:https://leetcode.com/problems/basic-calculator-ii/ Implement a basic calculator to evaluate ...

  10. LeetCode Basic Calculator

    原题链接在这里:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a s ...

随机推荐

  1. navicat 激活流程

    Navicat Premium 12激活 我自己测试了一下可以激活,很好用 原作链接:https://blog.csdn.net/loveer0/article/details/82016644 Na ...

  2. pano2vr制作360全景图

    1.下载pano2vr中文破解版2.制作360全景选择"矩形球面投影" 3.输出格式选择HTML5, 也可选择Flash(快被淘汰) 4.HTML5输出选项中3个重要选项4.1 F ...

  3. tpcc-mysql安装、使用、结果解读

    请点击:http://www.aikaiyuan.com/8687.html 错误处理: ln -s /usr/local/mysql/lib/libmysqlclient.so. /usr/lib6 ...

  4. etc/fstab

    etc/fstab 就是在开机引导的时候自动挂载到linux的文件系统 设备名称 挂载点 分区的类型 挂载选项 dump选项 fsck选项UUID=ce25cdc7-434f-420b-b3 / ex ...

  5. 树形DP求树的直径

    hdu4607 Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  6. java之面向对象三大特征(封装,继承,多态)

    一.封装 封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的对外方法进行内部信息的操作和访问. 封装可以达到以下目的: 1)隐藏类的实现细节 2)让使用者只 ...

  7. 170801、VM性能调优

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  8. Pentaho Report Designer 数据大于某值显示红色

    在细节栏中的字段的属性, 在样式的text-color,右边的表达式 输入下面表达式即可! =IF( [ALL_VALUE] > 50 ; "black" ; IF([ALL ...

  9. Android--aapt命令

    1.aapt l[ist] [-v] [-a] file.{zip,jar,apk} 释义:列出压缩文件中的内容 aapt l xxx.apk:简单的罗列压缩文件中每一项的内容 aapt l -v x ...

  10. struts2的琐碎知识点

    servlet:void init(ServletConfig cfg):// 读取servlet的配置参数void service(ServletRequest request, ServletRe ...