问题描述:

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

思路:

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

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. java EE ME SE有什么关系

    1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程 ...

  2. SPF难以解决邮件伪造的现状以及方案

    邮件伪造的现状 仿冒域名 私搭邮服仿冒域名: 例如某公司企业的域名是example.com,那么攻击者可以搭建一个邮服,也把自己的域名配置为example.com,然后发邮件给真实的企业员工xxx@e ...

  3. 【BZOJ4278】[ONTAK2015]Tasowanie 后缀数组

    [BZOJ4278][ONTAK2015]Tasowanie Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含 ...

  4. mysql客户端不能插入中文字符

    问题:输入中文报错:Incorrect string value 步骤: 1.查看MySQL编码设置 show variables like '%character%'; 2.重新设置编码(注意:ut ...

  5. Zend_Framework_1 框架是如何被启动的?

    Zend Framework 1 是一个十年前的老框架了,我接触它也有两年了,现在来写这篇文章,主要原因是最近要写入职培训教程.公司项目基本上都是基于Zend1框架,即使现在要转 Laravel 也肯 ...

  6. 170524、java.lang.IllegalArgumentException: No converter found for return value of type异常解决

    错误原因及解决步骤 1.原因:这是因为springmvc默认是没有对象转换成json的转换器的,需要手动添加jackson依赖. 2.解决步骤: 手动添加jackson依赖到pom.xml文件中 &l ...

  7. 170516、ActiveMQ 的安装与使用(单节点)

    ActiveMQ 的安装与使用(单节点)IP: 192.168.4.101环 境: CentOS 6.6 . JDK71. 安装 JDK 并配置环境变量(略)JAVA_HOME=/usr/local/ ...

  8. 《挑战程序设计竞赛》2.5 最小生成树 POJ3723 3169 1258 2377 2395 AOJ2224(1)

    POJ3723 http://poj.org/problem?id=3723 题意 windy要组建一支军队,召集了N个女孩和M个男孩,每个人要付10000RMB,但是如果一个女孩和一个男孩有关系d的 ...

  9. Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%。再往后,每提高0.1%,优化难度成指数级增长了。哪怕是千分之一,也直接影响用户体验,影响每天上万张机票的销售额。 在高并发场景下,提供了保证线程安全的对象、方法。比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好。线程安全的StringBuilder取代S

    Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%.再往后,每提高0.1%,优化难度成指数级增长了.哪怕是千分之一,也直接影响用户体验,影响每天上万张机 ...

  10. NGINX:漫谈优化

    优化那些事儿 生产环境下网站做前期的优化肯定是比不可少的,简单来说就是用同等条件的硬件资源,处理更多的网站业务,大程度提供网站业务处理能力:前辈留下的实战经验可都是财富,好多坑只有踩过才知道痛,下面就 ...