227. Basic Calculator
1. 问题描述
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
"3+2*2" =
" 3/2 " =
" 3+5 / 2 " =
Note: Do not use the eval built-in library function.
Tags:String
Similar Problems:(H)Basic Calculator、(H)Expression Add Operators
Solution:
class Solution {
public:
int calculate(string s) { }
};
2. 解答思路
2.1 合法性判断
- 空字符串
- 在第一个数字字符('0'~'9')出现前(假设在位置i),则位置0到位置i的字符只能为空格‘ ’或一个正负号‘+’或‘-’号
- 除数字、加、减、乘、除、空格字符外,其他字符均为非法字符,返回0。同时,需设置全局标志位,与计算结果为0进行区分
- 有没有可能多个运算符字符相邻?e.g. "- + /"、“*/-” etc. 不会,因为题目中说You may assume that the given expression is always valid.
- 若有溢出如何处理
2.2 整数提取
- 如何从相邻的多个空格与数字字符的串中,提取出整数
2.3 算法
- 原则:两次循环,先算乘除、再算加减
- 第1轮循环:若遇到乘除运算符,则将栈顶元素与提取的数字进行运算,删除栈顶元素,将结果入栈,依次类推...
- 第2轮循环:将栈中元素依次取出进行加法运算
3. 代码
#include <cctype> //使用isdigit()、isspace()函数时需要
#include <stack> //使用STL stack时需要
using namespace std;
class Solution {
public:
int calculate(string s) {
long long num = ;
char ch_Oper = '+';//用于保存提取到的运算符
for (size_t i = ; i < s.size(); i++)//使用size()函数与使用length()函数的区别
{
if (isdigit(s[i])) //检查参数c是否为阿拉伯数字0到9
{
num = num * + s[i] - '';
} if (!isdigit(s[i]) && !isspace(s[i]) || i == s.size()-)//i == s.size()-1表示单独处理最后一个整数
{
switch (ch_Oper)
{
case '+':
break;
case '-':
num = -num;
break;
case '*':
num = numStack.top() * num;
numStack.pop();
break;
case '/':
num = numStack.top() / num;
numStack.pop();
break;
default:
break;
} numStack.push(num);
num = ;
ch_Oper = s[i];
}
} while (!numStack.empty())
{
num += numStack.top();
numStack.pop();
} return (int)num;
} private:
stack<long long> numStack;
};
4. 反思
本题代码中有处处理很是巧妙:
- 若遇到负号运算符'-',则令num = -num,从而在第二次循环(while循环)中,只需进行加法运算。
小知识点:
- isdigit()、isspace()的用法(需包含#include <ctype.h>(旧版),#include <cctype>(新版)头文件)
- STL中stack容器的用法
- string s, 如何判断其大小:s.size()、s.length();如何访问其中的某个字符:s[i]、s.at(i)
- 如何使用堆栈实现算术运算,如何将减法转换为加法,如何处理乘除运算
227. Basic Calculator的更多相关文章
- leetcode 224. Basic Calculator 、227. Basic Calculator II
这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...
- 【LeetCode】227. Basic Calculator II 解题报告(Python)
[LeetCode]227. Basic Calculator II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...
- 224. Basic Calculator + 227. Basic Calculator II
▶ 两个四则表达式运算的题目,第 770 题 Basic Calculator IV 带符号计算不会做 Orz,第 772 题 Basic Calculator III 要收费 Orz. ▶ 自己的全 ...
- [LeetCode] 227. Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- 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 ...
- 227. Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- (medium)LeetCode 227.Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- 【LeetCode】227. Basic Calculator
Problem: Implement a basic calculator to evaluate a simple expression string. The expression string ...
随机推荐
- windows后台服务程序编写
Windows后台服务程序编写 1. 为什么要编写后台服务程序 工作中有一个程序需要写成后台服务的形式,摸索了一下,跟大家分享. 在windows操作系统中后台进程被称为 service. 服务是一种 ...
- yii post delete request more safe
常规的delete方法如下: /** * Deletes a particular model. * If deletion is successful, the browser will be r ...
- at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333)
at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333) 原因: null request
- C语言的本质(7)——C语言运算符大全
C语言的本质(7)--C语言运算符大全 C语言的结合方向 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左).例如算术运算符的结合性是自左至右,即先左后右.如有表达式 x- ...
- WEB网站前端性能分析相关
现在的网站分析工具,数据源主要有两种,分别是服务器日志(WebServer Log)和采集日志 买 优化要根据具体的业务和场景来分析 埋点:监控用户点击的每一步
- 1.2 linear SVM 推导
1.将公式中的distance具体化 将$w_0$单独抽出作为$b$,$w=(w_1,...,w_n),x=(x_1,...,x_n)$ 则分割平面为:$w^Tx+b=0$ A.证明w为法向量 ...
- linux svn服务器普通passwd和sasl2配置
朋友昨天问我一个问题,他公司使用的vpn连接的svn,使用svn管理软件进行svn update是可行的,使用命令行svn update出错,svn status可行. 思路1: 刚开始我关注的焦点都 ...
- Weinre - 远程调试工具
Weinre 代表Web Inspector Remote,是一种远程调试工具.借助于网络,可以在PC上直接调试运行在移动设备上的远程页面,中文意思是远程Web检查器,有了Wei ...
- VS2015 开发人员命令提示,如何实现记事本编程
开始,选择VS2015 开发人员命令提示,打开 找到.c文件的位置,复制位置 在VS2015 开发人员命令提示, 输入cd 位置 回车 然后输入cl 文件名 回车 这样进行编译
- 面试题25:最小的K个数
方法一:对n个整数进行排序(快速排序或堆排序),取出前K个元素(最容易想到的最笨的方法,不可取) 时间复杂度:O(n*logn) + O(k) = O(n*logn) 采用快速排序的代码: #incl ...