224-m-Basic Calculator

原创 2015年07月07日 21:50:38

有括号的运算,只有加减运算。很明显本题只考察括号匹配没有再加入乘除,否则就真是半个计算器的工程了。由于我是先写了计算器二式,所以本题也想用一次扫描就出结果。但由于有括号要考虑出栈,要考虑单个括号括的数、左右括号中有算式的、连续括号的,所以边界判断很多,写了3种情况,一个个if把程序搞得很臃肿,自我感觉写的不好。

其实本题我觉得用2n时间度可能更好,第一遍扫就干托括号的事,第二遍再扫就干计算的事,逻辑就更清楚,应该也不慢。

臃肿程序如下,ac12ms:

int calculate(char* s) {
    int result = 0;
    int n = 10240;
    int numstack[n];
    char operastack[n];
    memset(numstack, 0, sizeof(int) * n);
    memset(operastack, 0, sizeof(char) * n);
    char *sp = s;
    char *nums = "1234567890";
    char *operas = "(+-";
    char *plusMinus = "+-";
    char left = '(', right = ')';
    
    int num = 0;
    int indexn = 0, indexo = 0;
    bool isKuohao = false;
    while (*sp != '\0') {
        if (strchr(nums, *sp)) { //操作数入栈
            while (strchr(nums, *sp) && *sp != '\0') {
                num = num * 10 + *sp - '0';
                sp++;
            }
            numstack[indexn] = num;
            indexn++;
            if (indexn > 1 && strchr(plusMinus, operastack[indexo - 1])) { //操作数大于1且操作栈最后一个是可运算符则直接运算
                int temp = 0;
                if (operastack[indexo - 1] == '+')
                    temp = numstack[indexn - 1] + numstack[indexn - 2];
                else
                    temp = numstack[indexn - 2] - numstack[indexn - 1];
                numstack[indexn - 2] = temp;
                indexn--;
                indexo--;
            }
        }
        if (strchr(operas, *sp) && *sp != '\0') { //操作符入栈
            num = 0;
            operastack[indexo] = *sp;
            indexo++;
            if (indexo > 1 && strchr(plusMinus, operastack[indexo - 1]) && strchr(plusMinus, operastack[indexo - 2])) {
                //连续两个为可操作符时则计算前一个
                int temp = 0;
                if (operastack[indexo - 2] == '+')
                    temp = numstack[indexn - 1] + numstack[indexn - 2];
                else
                    temp = numstack[indexn - 2] - numstack[indexn - 1];
                numstack[indexn - 2] = temp;
                indexn--;
                operastack[indexo - 2] = operastack[indexo - 1];
                indexo--;
            }
        }
        if (*sp == right) { //遇到右括号,则退栈运算
            if (operastack[indexo - 1] == '(')
                indexo--;
            else
            {
                int tempn = 0;
                char tempo = operastack[indexo - 1];
                if (tempo == '+')
                    tempn = numstack[indexn - 2] + numstack[indexn - 1];
                else
                    tempn = numstack[indexn - 2] - numstack[indexn - 1];
                numstack[indexn - 2] = tempn;
                indexn--;
                indexo -= 2;
            }
            isKuohao = true;
        }
        sp++;
    }
    if (isKuohao && indexo > 0) {
        char tempo = operastack[0];
        if (tempo == '+')
            numstack[0] = numstack[0] + numstack[1];
        else if (tempo == '-')
            numstack[0] = numstack[0] - numstack[1];
    }
    result = numstack[0];
    
    return result;
}


【HDU】5238 Calculator 【中国剩余定理+线段树】

传送门:【HDU】5238 Calculator题目分析:模数可以拆成四个小素数:7,13,17,19。 这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好。中间我们用线段树,保存每个模...
  • u013368721
  • u013368721
  • 2015年05月29日 12:55
  • 1546

Android Calculator2源码分析与修改

将Android 4.4.4的计算器Calculator移植出来,可以独立的在Android Studio中使用。完整的代码已经推到我的GitHub,链接在文末。 下面看一下效果图: 这是在三星手...
  • zhoumushui
  • zhoumushui
  • 2015年04月14日 16:13
  • 1942

【Android App】Calculator(二)计算过程详细分析

在上一片文章【Android App】Calculator(一)onCreate过程分析
  • WOAI_TT
  • WOAI_TT
  • 2014年09月09日 21:12
  • 1509

Beaver's Calculator 【归并排序+贪心】

问题描述   从万能词典来的聪明的海狸已经使我们惊讶了一次。他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0"。它非常特别,并且被计划使用在各种各样的科学问题中。...
  • u014641529
  • u014641529
  • 2016年05月14日 11:13
  • 1036

Calculator源码分析

说明:该文章基于android 5.1的源码进行分析。 calculator的效果图: packages/apps/Calculator/AndroidManifest.xml 我们先来看...
  • lz99770337
  • lz99770337
  • 2015年07月20日 10:44
  • 706

hdu - 5238 Calculator(线段树+中国剩余定理)线段树好题

原来还不知道中国剩余定理能干什么用,先上几篇中国剩余定理的介绍 下面内容转自:http://wenku.baidu.com/link?url=g1Hiu6UtSoOR6Y3tiHpn5M3_HPn...
  • u010660276
  • u010660276
  • 2015年06月06日 13:33
  • 806

Python 3基础教程16-类

本文介绍类和简单使用,类是需要class这个关键字来声明的,一般如下面的语法: class className:          def fun1():                pass...
  • u011541946
  • u011541946
  • 2017年05月06日 13:52
  • 1058

Reverse Polish Calculator (逆波兰计算器)方案的分析——如何解决问题,从需要到实现

Reverse Polish Calculator (逆波兰计算器)方案的分析——如何解决问题,从需要到实现 分类: 【这就是C】2013-09-04 23:28 262人阅读 评论(0...
  • pi9nc
  • pi9nc
  • 2014年03月23日 09:38
  • 2187

Basic Calculator (非常重要)

227. Basic Calculator II Implement a basic calculator to evaluate a simple expression string. The...
  • gao1440156051
  • gao1440156051
  • 2016年08月13日 17:46
  • 215

ArcMap中属性字段计算器(Field Calculator)的使用技巧

 很多时候,我们在使用ArcGIS进行属性数据编辑时,需要批量修改某些字段值,这时候ArcGIS提供的属性字段计算器(Field Calculator)就是一把利器。下面我就Field Calc...
  • yiranaiu
  • yiranaiu
  • 2015年04月06日 14:56
  • 16070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:224-m-Basic Calculator
举报原因:
原因补充:

(最多只允许输入30个字)