Basic Calculator
本博客介绍leetcode上的一道不难,但是比较经典的算法题。
题目如下:
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open
(and closing parentheses), the plus+or minus sign-, non-negative integers and empty spaces.You may assume that the given expression is always valid.
Some examples:
也可以直接参考 https://leetcode.com/problems/basic-calculator/
这是简单的加减计算运算题,一个直观的思路是运用栈,以及用后缀表达式求值。实现这一种算法,需要构造两个栈,分别是运算符栈和数字栈,然后将输入的中序表达式在转化为后续表达式的过程中求值。
考虑到这道题目的特殊性,运算符只有加减和括号,我们可以转化加减运算符为(±1),这样可以省略计算时的判断语句,而直接将转化后的运算符数作为被加(减)数的系数
这是我的代码
int calculate(string s) {
s.push_back('#'); //防止栈溢出
stack<int>num; //数字栈
stack<int>oper; //运算符栈
for(int i=; i<s.length()-;++i)
{
if(isdigit(s[i])) //判断数字,压入数字栈
{
int temp = s[i]-'';
while(++i && isdigit(s[i]))
{
temp = temp * + s[i] - '';
}
num.push(temp);
}
switch (s[i]){
case '(': //'('直接压入栈,其代表数为0
oper.push();
break;
case '+':
case '-':
if(!oper.empty() && oper.top() != ) //栈中有加减运算符,则先弹出,再压入现在的运算符
{
int num1 = num.top(); num.pop();
int num2 = num.top(); num.pop();
num.push(num2 + num1 * oper.top());
oper.pop();
}
if(s[i] == '-')
oper.push(-);
else oper.push();
break;
case ')': //为')',则一直弹出栈至弹出第一个'('
if(oper.top() == )
oper.pop();
else
{
int num1 = num.top(); num.pop();
int num2 = num.top(); num.pop();
num.push(num2 + num1 * oper.top());
oper.pop();
oper.pop();
}
break;
case '#':
break;
}
}
if(oper.empty())
return num.top();
else
{
int num1 = num.top(); num.pop();
int num2 = num.top(); num.pop();
return (num2 + num1 * oper.top());
}
}
其实这个算法的效率并不是很高,原因在于,每个数字都要压栈、退栈,每个操作符(除了')')也同样如此。
下面这个算法是讨论区上面的比较优秀的算法,其亮点是
- 用独立的变量存储上次的数字和加减运算符,在n次连续加减运算时省略了分别n-1次出入栈;
- 遇到'(',只压入前面的加减运算符,默认为加法。
class Solution {
public:
int calculate(string s) {
stack <int> nums, ops;
int num = ;
int rst = ;
int sign = ;
for (char c : s) {
if (isdigit(c)) {
num = num * + c - '';
}
else {
rst += sign * num;
num = ;
if (c == '+') sign = ;
if (c == '-') sign = -;
if (c == '(') {
nums.push(rst);
ops.push(sign);
rst = ;
sign = ;
}
if (c == ')' && ops.size()) {
rst = ops.top() * rst + nums.top();
ops.pop(); nums.pop();
}
}
}
rst += sign * num;
return rst;
}
};
也可以参考https://leetcode.com/discuss/53921/16-ms-solution-in-c-with-stacks
Basic Calculator的更多相关文章
- [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 ...
- 数据结构与算法(1)支线任务2——Basic Calculator
题目:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a simple ...
- 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 ...
随机推荐
- 模拟下载的进度条ProgressBar
作者:堕落的天使 图片效果 activity_main.xml(代码) <RelativeLayout xmlns:android="http://schemas.android.co ...
- python 2day
一 优化 username='alex' password=‘alex123’ 可以写成 username,password =‘alex’,'alex123' 二.再次优化 for i in ran ...
- chrome中showModalDialog解决方案
调用myShowModalDialog function myShowModalDialog(url, width, height, callback) { if(window.showModalDi ...
- asp.net 一次性提交大量数据,服务器会报错,要在 web.config 中设置一下
web.config <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应 ...
- js中join函数的使用方法(js输出html标签)
var arr = ['item 1', 'item 2', 'item 3', ...]; var list = '<ul><li>' + arr.join('</li ...
- js数组的操作
很早之前整理的一篇文章,感觉比较清晰. 一.数组元素的操作 1.数组的创建 var arrayObj = new Array(); var arrayObj = new Array(size); // ...
- C语言PIC32 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天介绍下我新完成的为 ...
- 执行Python "/bin/usr/python: bad interpreter: No such file or directory" 错误
今天在电脑上写了一个Python脚本,写好之后用ftp传上去,然后执行/var/www/cron.py,结果报错,/bin/usr/python: bad interpreter: No such f ...
- 40、dom以xml结尾的文件
1.student.xml文件 <?xml version="1.0" encoding="utf-8" ?> <!-- 1.书写根元素(因为 ...
- 通过反射获得 spring 的 RequestMapping value值
package demo import java.lang.reflect.Method; import org.springframework.web.bind.annotation.Request ...