151. 表达式计算4 AcWing

2020-12-28 15:26

阅读:605

标签:bsp   for   get   txt   rgba   技巧   就是   表达式计算   wrong   

原题链接

一看题目基本就是栈了,这里配Y总视频可以get到一些小技巧,比如给整个表达式加上(),这样就不用在字符串达到底端时,再判断栈空.

本道题会有多余的括号出现,比如((((((-1),(2+3))))) 我们可以参考上面的技巧,在遍历字符串前给字符串加上足够的左括号,这样就可以避免有多余)而(不够的情况.

本题坑点:

  1. -判断是负数还是减号
  2. 数字有多位
  3. 负号后面可能是个(),这时候我们要当作-号计算,被减数是0(这种情况比较特殊,我们要先当作负号,把0装入栈再当作减号计算)
  4. 这里的负号因为那个特殊情况比较难判断,我们可以换成!减号的情况(eg:8-2*3如果当作负号就会计算错误)
 1 #include  2 using namespace std;
 3 stackint> nums;
 4 stackchar> cal;
 5 void calculate()
 6 {
 7     int x = nums.top(); nums.pop();
 8     int y = nums.top(); nums.pop();
 9     char ch = cal.top(); cal.pop();
10     int ans;
11     if(ch==+)  ans = y+x;
12     else if(ch==-) ans=y-x; 
13     else if(ch==*) ans = y*x;
14     else if(ch==/) ans = y/x;
15     else if(ch==^){
16         int t = 1;
17         while(x--) t*=y;
18         ans = t;
19     }
20     else printf("ans wrong\n");
21 //    printf("%d\n",ans);
22     nums.push(ans);
23 }
24 int main()
25 {
26 //    freopen("in.txt","r",stdin);
27     string s,str;
28     cin>>s;//多余括号 ,即不改变运算结果的括号eg: (((((1) ((1+3))))) 如果没有正确处理,将会导致错误 
29     for(int i=0;i‘(;//如果s后面有很多右括号就需要特判 
30     s = str+s+);//最后堆栈计算就是将()内全部算完,我们可以加上()这样可以不用再写字符串已完栈不空的情况
31     for(int i=0;i){
32         if(isdigit(s[i])){//如果是数字 注意可能不止一位数 
33             int j = i,d = 0;
34             while(isdigit(s[j])){
35                 d = d*10+(s[j]-0);
36                 j++;
37             }
38             nums.push(d);
39             i = j-1;
40         }else if(s[i]==+||s[i]==-){//如果是+或-优先级最低,可以直接计算 注意负数 
41             if(s[i]==-&&i&&!(s[i-1]==)||isdigit(s[i-1]))){//如果是负数 加了很多( 
42                 if(s[i+1]==() cal.push(s[i]);
43                 int j = i+1,d = 0;//此判断条件错误 8-2*3(2会被看成-2) 
44                 while(isdigit(s[j])){
45                    d = d*10+(s[j]-0);
46                    j++;
47                 }
48                 nums.push(-d);
49                 i = j-1;
50             }else{
51                 while(nums.size()>1&&cal.top()!=() calculate();
52                 cal.push(s[i]);
53             }
54         }else if(s[i]==*||s[i]==/){ 
55             while(cal.top()!=+&&cal.top()!=-&&cal.top()!=() calculate();
56             cal.push(s[i]);
57         }else if(s[i]==^){
58             while(cal.top()==^) calculate();
59             cal.push(s[i]);
60         }else if(s[i]==)){
61             while(cal.top()!=() calculate();
62             cal.pop();
63         }else if(s[i]==() cal.push(s[i]);
64     }
65     printf("%d\n",nums.empty()?0:nums.top());
66     return 0; 
67 } 

 

151. 表达式计算4 AcWing

标签:bsp   for   get   txt   rgba   技巧   就是   表达式计算   wrong   

原文地址:https://www.cnblogs.com/ndfwblog/p/14170941.html


评论


亲,登录后才可以留言!