博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode-227 Basic Calculator II
阅读量:4506 次
发布时间:2019-06-08

本文共 2362 字,大约阅读时间需要 7 分钟。

题目描述

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.

 

题目大意

实现一个最基本的计算器,输入一个字符串,字符串中只包含 ‘0-9’,‘+’,‘-’,‘*’,‘/’,‘ ’。

 

示例

E1

Input: "3+2*2"Output: 7

E2

Input: " 3/2 "Output: 1

E3

Input: " 3+5 / 2 "Output: 5

 

解题思路

算法要比LeetCode-224简单一些,由于没有小括号,只需要依次从左至右计算就好,可以使用一个数组来保存四个运算符的优先值,在进行计算的时候,将当前的运算符与栈顶保存的运算符比较优先级,若优先级较高则入栈,否则先将栈顶的运算符计算完毕。

 

复杂度分析

时间复杂度:O(N)

空间复杂度:O(N)

 

代码

class Solution {public:    int calculate(string s) {        int len = s.length();        // 将字符串转变为优先级数组中的索引位置,方便之后的比较        oti['+'] = 0;        oti['-'] = 1;        oti['*'] = 2;        oti['/'] = 3;        // 依次遍历字符串        for(int i = 0; i < len; ++i) {            // 遇到空格跳过            if(s[i] == ' ')                continue;            // 遇到数字入栈            else if(s[i] >= '0' && s[i] <= '9') {                int tmp = s[i] - '0', j = i + 1;                while(j < len && s[j] >= '0' && s[j] <= '9') {                    tmp *= 10;                    tmp += s[j] - '0';                    ++j;                }                i = j - 1;                num.push(tmp);            }            // 遇到操作符进行优先级判断,再进行计算和入栈操作            else {                while(!op.empty()) {                    if(!prio[oti[op.top()]][oti[s[i]]])                        break;                    cal();                }                op.push(s[i]);            }        }        while(num.size() > 1)             cal();                return num.top();    }    // 将栈顶的两个数字按照操作数栈顶的运算方法计算    void cal() {        int a, b, res;        char o = op.top();        b = num.top(); num.pop();        a = num.top(); num.pop();        op.pop();        switch(o) {            case '+' : res = a + b; break;            case '-' : res = a - b; break;            case '*' : res = a * b; break;            case '/' : res = a / b; break;        }        num.push(res);    }    private:    // 保存四个运算符的优先级大小,顺序依次为‘+’,‘-’,‘*’,‘\’    bool prio[4][4] = {        {
true, true, false, false}, {
true, true, false, false}, {
true, true, true, true}, {
true, true, true, true} }; stack
num; stack
op; map
oti;};

 

转载于:https://www.cnblogs.com/heyn1/p/11088775.html

你可能感兴趣的文章
C#面向对象基础
查看>>
adb server is out of date. killing...
查看>>
Jquery页面加载效果
查看>>
ios对new Date() 的兼容问题
查看>>
Spark发展现状与战线
查看>>
Charles常用设置
查看>>
filebeat
查看>>
如何在Bitmap中画图?(MFC)
查看>>
Windows 用来定位 DLL 的搜索路径
查看>>
常见的游戏设计技术
查看>>
Backbone 学习笔记五
查看>>
R语言:各种零碎
查看>>
Mysql5.7修改root密码
查看>>
docker入门3:基础操作(2)
查看>>
WC2019退役失败记
查看>>
Centos6.6下安装nginx1.6.3
查看>>
iOS开发之多线程
查看>>
[算法竞赛]第七章_暴力求解法
查看>>
关于全局替换空格,制表符,换行符
查看>>
MorkDown 常用语法总结
查看>>