码迷,mamicode.com
首页 > 其他好文 > 详细

解题报告:LeetCode Basic Calculator(简单计算器)

时间:2015-10-19 22:09:46      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

题目出处:https://leetcode.com/problems/basic-calculator/
题意描述:
给定一个只含加减号,括号,空格和非负数的合法字符串,在不调用库函数eval的条件下求出其值

解决思路:
由于此题只有加减号,因此不存在运算符优先级的问题,只需要稍微注意一下括号即可。
因此,可以用两个栈ops,numbers来分别存储未处理的运算符和未处理的数字,并对字符串进行一次扫描。对于对于扫描到的任意字符是s[i],做如下处理:
  若s[i]为空格,则继续扫描。
  若s[i]为左括号‘(’,则直接进栈
  若s[i]为右括号‘)’,则将栈中左括号之上的所有运算符按照从上之下的顺序依次处理,处理完毕后将左括号出栈。
  若s[i]为加号‘+’或减号‘-’,则判定上一运算符是否是否存在,且是否是左括号‘(’,若存在且不是,则将numbers栈顶的俩数出栈,与运算符计算出结果将结果压入栈。否则直接将该运算符压入栈。
  若s[i]为数字则取出当前所在位置的所有数字并求出该值,将该数压入numbers栈,并将扫描指针往后移相应的位置。
最后,扫描结束后,直接输出numbers栈顶的元素即可。

算法复杂度分析:
  此算法对字符串进行了一次扫描,时间复杂度为O(n),用了两个栈来存储字符串中的内容,因此空间复杂度也为O(n),其中n为字符串的长度。

下面直接附上源码(注:为了后续程序判断简洁,在函数calculate的开始进行了预处理,在运算符栈ops中压入了左括号‘(’,并在s末尾加入了右括号‘)’ )

 1 #include <iostream>
 2 #include <string>
 3 #include <ctype.h>
 4 #include <stack>
 5 using namespace std;
 6 
 7 class Solution {
 8 public:
 9 
10     int op(int n1, int n2, char c)
11     {
12         int ans = 0;
13         switch(c)
14         {
15             case +: 
16                 ans = n1+n2; 
17                 break;
18             case -: 
19                 ans = n1-n2; 
20                 break;
21         }
22         return ans;
23     }
24 
25     int calculate(string s) 
26     {
27         stack<char> ops;
28         stack<int>     numbers;
29         ops.push(();
30         s.push_back());
31         for(int i = 0; i < s.length(); i ++)
32         {
33             switch(s[i])
34             {
35             case  : continue;          break;
36             case (: ops.push(s[i]);    break;
37             case ):
38                 while(ops.top() != ()
39                 {
40                     int n1 = numbers.top();
41                        numbers.pop();
42                        int n2 = numbers.top();
43                        numbers.pop();
44                     char op_top = ops.top();
45                     ops.pop();
46                     numbers.push(op(n2, n1, op_top));
47                 }
48                 ops.pop();
49                 break;
50             case +:
51             case -:
52                 if(ops.empty() || ops.top() != ()
53                 {
54                     int n1 = numbers.top();
55                        numbers.pop();
56                        int n2 = numbers.top();
57                        numbers.pop();
58                     char op_top = ops.top();
59                     ops.pop();
60                     numbers.push(op(n2, n1, op_top));
61                 }
62                 ops.push(s[i]);
63                 break;
64             default:
65                 int num = s[i]-0;
66                 while(isdigit(s[i+1]))
67                 {
68                     num = num*10+s[++i]-0;
69                 }
70                 numbers.push(num);
71                 break;
72             }
73         }
74         return numbers.top();
75     }
76 };
77 
78 int main()
79 {
80     Solution solution;
81     string s;
82     cin >> s;
83     cout << solution.calculate(s) << endl;
84     
85     return 0;
86 }

 

解题报告:LeetCode Basic Calculator(简单计算器)

标签:

原文地址:http://www.cnblogs.com/bill-liu/p/4892969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!