本博客介绍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());
}
}

其实这个算法的效率并不是很高,原因在于,每个数字都要压栈、退栈,每个操作符(除了')')也同样如此。

下面这个算法是讨论区上面的比较优秀的算法,其亮点是

  1. 用独立的变量存储上次的数字和加减运算符,在n次连续加减运算时省略了分别n-1次出入栈;
  2. 遇到'(',只压入前面的加减运算符,默认为加法。
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的更多相关文章

  1. [LeetCode] Basic Calculator II 基本计算器之二

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  2. [LeetCode] Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  3. Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  4. 数据结构与算法(1)支线任务2——Basic Calculator

    题目:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a simple ...

  5. LeetCode#227.Basic Calculator II

    题目 Implement a basic calculator to evaluate a simple expression string. The expression string contai ...

  6. Java for LeetCode 227 Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  7. Java for LeetCode 224 Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  8. LeetCode Basic Calculator II

    原题链接在这里:https://leetcode.com/problems/basic-calculator-ii/ Implement a basic calculator to evaluate ...

  9. LeetCode Basic Calculator

    原题链接在这里:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a s ...

随机推荐

  1. 阐述ArrayList、Vector、LinkedList的存储性能和特性?(转)

    ArrayList 和Vector他们底层的实现都是一样的,都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内 ...

  2. 因为此控件已在 web.config 中注册并且与该页位于同一个目录中

    在web.config文件配置了用户控件 <pages> <controls> <add tagPrefix="my" tagName="l ...

  3. SQL Server 2008 R2企业版开发版等版本下载 (转载)

    一. 简体中文 1. SQL Server 2008 R2 Developer (x86, x64, ia64) - DVD (Chinese-Simplified) File Name: cn_sq ...

  4. oracle数据库中的基本语句

    下面的都是最基本的oracle数据库的数据查询语句,这是我在网上整理的一份文档,方便以后自己的查看,当然,能把这些记下来就是最好的. 说明:查询表中的数据 1. select * from emp; ...

  5. sublimetext 3 set

    from https://segmentfault.com/a/1190000002596724{ "font_size": 21, "highlight_line&qu ...

  6. 最长公共子序列LCS问题

    很经典的一个问题,也是常考的问题

  7. 使用yum安装应用程序时候,报错:[Errno 14] PYCURL ERROR 7 - "Failed to connect to 2001:da8:8000:6023::230: 网络不可达"

    使用yum安装应用程序时候,报错:[Errno 14] PYCURL ERROR 7 - "Failed to connect to 2001:da8:8000:6023::230: 网络不 ...

  8. null值与空值比较

    JAVA中判断字符串或者数值是否为空时,常用到  .equals函数对空值进行判断 例如  values[5]为参数值 "".equals(values[5]) 常在if语句判断中 ...

  9. How to acquire an Android phone with locked bootloader?

    As we know that some devices come with locked bootloaders like Sony, HUAWEI, hTC...If you try to unl ...

  10. leetcode 198

    198. House Robber You are a professional robber planning to rob houses along a street. Each house ha ...