224、Basic Calculator

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.

 

这个题目的思路要考虑的情况比较多,主要的想法是:符号相当于数字之前的正负号;默认在第一个数字之前加了正号。
有一个基准result为0,可能有5种情况:
/*
1、如果是数字,就转换为十进制;考虑123+122等(isdigit函数);
2、如果是+号,用result去和上一个符号(sign)和数字(number)运算,然后将number清空,符号'+'保存;
3、'-'同上;
4、如果是'('那么利用一个栈,将之前的结果result保存,将'('前的符号sign保存;然后将result和sign初始化(类似于重新开始计算);
5、如果是')'那么这个括号中的result要和之前保存的result(stack)还有sign(stack)进行计算。
*/

 1  int calculate(string s) {
 2         long int result=0;
 3         stack<long int> s1;
 4         int sign=1,i=0;
 5         int number=0;
 6       //  2+1+(4+5+2)-3+7
 7         while(i<s.size())
 8         {
 9             //123
10             if(isdigit(s[i]))
11             {
12                 number=number*10+(s[i]-'0');
13             }
14             else if(s[i]=='+')
15             {
16                 result+=sign*number;
17                 sign=1;
18                 number=0;
19             }
20             else if(s[i]=='-')
21             {
22                 result+=sign*number;
23                 sign=-1;
24                 number=0;
25             }
26             else if(s[i]=='(')
27             {
28                 s1.push(result);
29                 s1.push(sign);
30                 result=0;
31                 sign=1;
32             }
33             //符号是括号中result前的正负号。
34             else if(s[i]==')')
35             {
36                 result+=sign*number;
37                 //非常重要
38                 number=0;//否则括号前一个数字要被计算两次。
39                 long temp=s1.top();
40                 s1.pop();
41                 result*=temp;
42                 result+=s1.top();
43                 s1.pop();
44             }
45             i++;
46         }
47         result+=sign*number;//每次遇到下一个符号即数字后一个符号,才去算上一个数字及其前面的正负号。
48         return result;
49     }
50 };

 

posted on 2018-02-01 14:38  wsw_seu  阅读(101)  评论(0编辑  收藏  举报

导航