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:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in
library function.

实现:

void skipws(string &s, int * beg, bool b = false)

    {

        if (b) {

            while (s[*beg] == ' ') {

                (*beg)++;

            }

        } else {

            while (s[*beg] == ' ' || s[*beg] == '(' || s[*beg] == ')') {

                (*beg)++;

            }

        }

    }

    

    

    int numend(string &s, int beg)

    {

        while (s[beg] >= '0' && s[beg] <= '9') {

            beg++;

        }

        return beg;

    }

    

    int parenthesisend(string& s, int beg){

        int brace = 0;

        while (s[beg] != ')' || brace != 0) {

            if (s[beg] == '(') {

                brace++;

            } else if (s[beg] == ')') {

                brace--;

            }

            beg++;

        }

        return beg;

    }

    

    int calculate(string s) {

        int start = 0;

        

        int result = 0;

        while (start < s.size()) {

            skipws(s, &start);

            

            if (s[start] == '+') {

                start++;

                skipws(s, &start);

                int end = numend(s, start);

                result += atoi(s.substr(start, end-start).c_str());

                start = end;

            } else if (s[start] == '-') {

                start++;

                skipws(s, &start, true);

                if (s[start] == '(') {

                    start++;

                    int end = parenthesisend(s, start);

                    result -= calculate(s.substr(start, end-start));

                    start = end+1;

                }

                else {

                    int end = numend(s, start);

                    result -= atoi(s.substr(start, end-start).c_str());

                    start = end;

                }

            } else {

                int end = numend(s, start);

                result = atoi(s.substr(start, end-start).c_str());

                start = end;

            }

            skipws(s, &start);

        }

        return result;

    }

LeetCode224——Basic Calculator的更多相关文章

  1. LeetCode224. Basic Calculator (用栈计算表达式)

    解题思路 用两个栈分别存字符和数字. 顺序读入字符,处理方式分为字符和数字两种. 处理字符分为')'和非')'两种. 处理数字需要读取字符栈栈顶,分为'+'.'-'和非'+'.'-'. 代码 clas ...

  2. [Swift]LeetCode224. 基本计算器 | Basic Calculator

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

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

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

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

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

  5. Basic Calculator II

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

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

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

  7. Basic Calculator

    本博客介绍leetcode上的一道不难,但是比较经典的算法题. 题目如下: Implement a basic calculator to evaluate a simple expression s ...

  8. LeetCode#227.Basic Calculator II

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

  9. Java for LeetCode 227 Basic Calculator II

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

随机推荐

  1. 【MyBean调试笔记】关于单元的释放顺序

    [概述] DEMO提交人:惠商软件  2508696439 问题描述:MDIConsole, DEMO如果Forms单元引用顺序放在mybean.console.pas文件之后如下图所示时: 创建同一 ...

  2. Android MediaPlayer接口及状态迁移

    [时间:2016-09] [状态:Open] [关键词:android,mediaplayer,播放接口,播放状态图] 引言 本文内容相对简单,作为后续处理的起点,简要整理了Android Media ...

  3. 【转】如何在Mac上卸载Java及安装Java

    如何在 Mac 上卸载 Java? 本文适用于: 平台: Macintosh OS X Java 版本: 7.0, 8.0 使用终端卸载 Oracle Java 注:要卸载 Java,必须具有管理员权 ...

  4. Oracle使用Sql把XML解析成表(Table)的方法

    SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING XMLTYPE('<?xml version="1.0&qu ...

  5. LVS负载均衡模型及算法概述

    集群类型 LB: Load Balancing,负载均衡 HA:High Availability, 高可用 HP:High Performance, 高性能   负载均衡 负载均衡设备 Hardwa ...

  6. 在Mac系统下用STS搭建一个Spring MVC项目

    [本文出自天外归云的博客园] 从STS的下载到空项目的搭建 1. 下载STS,下载解压缩后点击sts-bundle文件夹中的STS文件启动ide: 2. 创建Spring MVC项目:File-> ...

  7. Liunx下Intel无线网卡驱动安装

    原文: https://blog.csdn.net/u014157776/article/details/78272611 首先查看网卡型号,指令: lspci | grep -i net 如果是In ...

  8. windows下html2jade批量转换

    将项目中的代码转换为jade,使用html2jade批量转换 @echo off SETLOCAL ENABLEDELAYEDEXPANSION for %%i in (*.html) do ( ht ...

  9. CSS网页布局中易犯的30个小错误

    即使是CSS高手,也难免在书写CSS代码的时候出一些小错误,或者说,任何一种代码都是如此.小错误却往往造成大问题,浪费很多无辜的时间来调试和排错.查看下面这份CSS网页布局中易犯的10个小错误,努力的 ...

  10. Node.js学习笔记(3)--url.parse方法

    说明(2017-5-2 14:23:47): 1. index.html <!DOCTYPE html> <html lang="en"> <head ...