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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

leetcode 224 Basic Calculator

1. 问题描述  计算字符串表达式的值,表达式中只含有(,),+,-,空格和非负整数。例如:   “1 + 1” = 2   ” 2-1 + 2 ” = 3   “(1+(4+5+2)-3)+(...

224. Basic Calculator

Problem Description Implementation By CProblem DescriptionImplement a basic calculator to evaluate a...

LeetCode-224.Basic Calculator

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

【leetcode】224. Basic Calculator

一、题目描述 Implement a basic calculator to evaluate a simple expression string. The expression s...

LeetCode 224. Basic Calculator

LeetCode 第224题 Basic Calculator JAVA语言实现

224. Basic Calculator

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

LeetCode-224. Basic Calculator (JAVA)实现计算器

224. Basic Calculator Implement a basic calculator to evaluate a simple expression string. The ...

[LeetCode]224. Basic Calculator

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

224. Basic Calculator

双栈一个用来放数字,一个用来放符号。其余看注释,90m,有点多,判断数字还可以优化下public class Solution { public int calculate(String s)...

Leetcode 224 - Basic Calculator(表达式求值1)

题意表达式求值,只含有+, -, (, )。思路转逆波兰表示后求值。转逆波兰的过程: 扫描字符串,如果是数字直接输出 如果是),那么一直出栈到遇到(。 如果是运算符,比较当前运算符op和栈顶运算符t...
  • Lzedo
  • Lzedo
  • 2017-03-05 20:07
  • 146
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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