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 ...
随机推荐
- MYSQLinsert速度过慢
MYSQLinsert速度过慢最近在用MySQL做存储,测试中发现插入数据太慢了,插入速度只有20 MY SQL insert 速度过慢最近在用MySQL做存储,测试中发现插入数据太慢了,插入速度只有 ...
- Eclipse安装Weblogic插件
1.启动Eclipse,打开window>References>server>Runtime server. 2.点击“add”按钮,添加新的web服务器. 注:上图Oracle是W ...
- hdu 4740
题目链接 老虎左拐,老鼠右拐,碰到不能走的拐一次,如果还不能走就停下,自己走过的不能走,求相遇的坐标或-1 一个停下之后,另一个还可以走 #include <cstdio> #includ ...
- C#中IList<T>与List<T>的区别感想【转】
写代码时对: IList IList11 =new List (); List List11 =new List (); 有所疑惑,于是在网上搜索一下,很受启发,于是收藏下来,但对部分观点不敢苟同,用 ...
- Egret初体验–躲避类小游戏
下面简单介绍一下我这个游戏:基本上就3个画面(准备再添加一个胜利的界面)开始画面,一个按钮,点击进入游戏游戏画面,滚动的背景,触摸移动的老鹰,从天而降的翔,以及右上角的时间条结束画面,显示结果,关注按 ...
- bootstrap-js(六)弹出框
实例 为任意元素添加一小块浮层,用于存放非主要信息. 弹出框的标题和内容的长度都是零的话将永远不会被显示出来. 初始化 由于性能的原因,工具提示和弹出框的 data 编程接口(data api)是必须 ...
- 【整理】SQLServer查询各种数据库对象(表,索引,视图,图表,存储过程等)
首先明确数据库对象的定义:数据库对象定义数据库内容的结构.它们包含在数据库项目中,数据库项目还可以包含数据生成计划和脚本. 常见的数据库对象包括:表,索引,视图,图表,缺省值,规则,触发器,存储过程, ...
- KMP字符串匹配
#include<iostream> using namespace std; #define MAX 255 typedef unsigned char BYTE; typedef BY ...
- lightoj 1064 Throwing Dice
题意:给你n个骰子,求n个骰子的和不小于x的概率. 刚开始想每给一组数就计算一次~~太笨了- -,看了别人的代码,用dp,而且是一次就初始化完成,每次取对应的数据就行了.WA了好多次啊,首先不明白的就 ...
- HTTP POST和GET的区别[转]
http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.aspx 1.HTTP 只有POST和GET 两种命令模式: 2.POST是被设 ...