支线任务2-Basic Calculator
问题描述:
题目要求我们实现一个简单的加减计算器,计算一个表达式的值,表达式除了数字之外还可能会含有括号,加减符号以及空格。
思路:
其实看到这个题自然就会想到利用后缀式求表达式值的算法作业题,况且这个题还没有乘法除法运算,我就沿用了做算法作业题的思路来求解:
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)支线任务2——Basic Calculator
题目:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a simple ...
- [LeetCode] Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- [LeetCode] Basic Calculator 基本计算器
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- Basic Calculator
本博客介绍leetcode上的一道不难,但是比较经典的算法题. 题目如下: Implement a basic calculator to evaluate a simple expression s ...
- LeetCode#227.Basic Calculator II
题目 Implement a basic calculator to evaluate a simple expression string. The expression string contai ...
- Java for LeetCode 227 Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- Java for LeetCode 224 Basic Calculator
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- LeetCode Basic Calculator II
原题链接在这里:https://leetcode.com/problems/basic-calculator-ii/ Implement a basic calculator to evaluate ...
- LeetCode Basic Calculator
原题链接在这里:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a s ...
随机推荐
- 【BZOJ3003】LED BFS+状压DP
[BZOJ3003]LED Description LED屏是由一个庞大的点阵小灯泡组成的,一开始每个小灯泡都不发光.每一行一共有N个小灯泡,依次标号为1~n.现在给定K个点,要求这K个点发光,其余点 ...
- xcode7/ios9中 低版本app运行时,屏幕上下出现黑边的问题
xcode从低版本升级至 7.0或更高版本后,某些低版本app再次编译运行后,发现app在设备上运行时,会在上端和底部 出现黑边的现象.这导致app的展示界面跟缩水了一样,变得十分丑陋. 对于这一问题 ...
- AndroidStudio build.gradle 报错
Android Studio. I'm getting this kind of error during application run. Error:Execution failed for ta ...
- 次小生成树(poj1679)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20737 Accepted: 7281 D ...
- 170622、springboot编程之JPA操作数据库
JPA操作数据库 什么事JAP?JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.在pom ...
- 基于JDK1.8的LinkedList源码学习笔记
LinkedList作为一种常用的List,是除了ArrayList之外最有用的List.其同样实现了List接口,但是除此之外它同样实现了Deque接口,而Deque是一个双端队列接口,其继承自Qu ...
- ubuntu ibus ,chinese input-method
第一:安装IBus框架, sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 启动IBus框架,在终端输入: im-s ...
- Delphi中那些容易混淆的基础(@、^、Addr、Pointer,Move、CopyMemory,GetMem和FreeMem、GetMemory和FreeMemory、New和Dispose、StrAlloc和StrDispose、AllocMem)
@.^.Addr.Pointer Delphi(Pascal)中有几个特殊的符号,如@.^等,弄清楚这些符号的运行,首先要明白Delphi指针的一些基础知识:指针,是一个无符号整数(unsigned ...
- Python开发【Django】:Model操作(一)
Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
- the source attachment does not contain the source for the file xxx.class无法关联到某个类
问题描述: 按下列操作添加相应路径(这里是错误操作) 该问题仍旧无法解决: 注意:这里spring-webmvc-4.1.7.RELEASE.JAR中确实包含AnntationMethodHandle ...