支线任务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 ...
随机推荐
- 关于VO、PO的理解——java的(PO,VO,TO,BO,DAO,POJO)解释
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据. 在O/R Mapping的世界里,有 ...
- 170720、springboot编程之properties文件讲解
但是在实际开发过程中有更复杂的需求,我们在对properties进一步的升华.在本篇博客中您将会学到如下知识(这节中有对之前的知识的温故,对之前的升华): (1) 在application.prope ...
- 170627、springboot编程之定时任务
springboot定时任务,比较简单! 1.编写DemoSchedule.java类 package com.rick.common.schedule; import org.springframe ...
- 05StuList.aspx(学生列表)
05StuList.aspx 加载学生列表(前天代码) <%@ Page Language="C#" AutoEventWireup="true" Co ...
- Code Forces 652C Foe Pairs
C. Foe Pairs time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- Finding files on a *nix/Linux and sorting by size
1. Finding files on *NIX and sort by size find ~ -iregex ".*/*.sh" -type f -print0 | xargs ...
- 使用DBMS_SUPPORT包
DBMS_SUPPORT包从Oracle7.2引入,主要功能用以提供更完整的用户session跟踪信息,这个包可以通过运行 dbmssupp.sql 和 prvtsupp.plb 两个脚本来创建.该脚 ...
- Tfs 2015 代理池配置笔记
Tfs的构建代理池其实是在代理服务器上开启一个TFSBuild的代理服务,配好相关的Tfs地址后,就能在Tfs管理界面看到了. 如果是Tfs服务和发布代理是同一台服务器,具体操作详见: 安装TFS20 ...
- 2.wireshark分析之TCP协议(一)
(1) TCP是怎么样的协议? TCP是一种面向连接(连接导向)的.可靠的基于字节流的传输层通信协议.TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认.对失序的数据重新排 ...
- talib 中文文档(九):Volume Indicators 成交量指标
Volume Indicators 成交量指标 AD - Chaikin A/D Line 量价指标 函数名:AD 名称:Chaikin A/D Line 累积/派发线(Accumulation/Di ...