标签:bsp for get txt rgba 技巧 就是 表达式计算 wrong
一看题目基本就是栈了,这里配Y总视频可以get到一些小技巧,比如给整个表达式加上(),这样就不用在字符串达到底端时,再判断栈空.
本道题会有多余的括号出现,比如((((((-1),(2+3))))) 我们可以参考上面的技巧,在遍历字符串前给字符串加上足够的左括号,这样就可以避免有多余)而(不够的情况.
本题坑点:
1 #include <bits/stdc++.h> 2 using namespace std; 3 stack<int> nums; 4 stack<char> 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.size();i++) str+=‘(‘;//如果s后面有很多右括号就需要特判 30 s = str+s+‘)‘;//最后堆栈计算就是将()内全部算完,我们可以加上()这样可以不用再写字符串已完栈不空的情况 31 for(int i=0;i<s.size();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 }
标签:bsp for get txt rgba 技巧 就是 表达式计算 wrong
原文地址:https://www.cnblogs.com/ndfwblog/p/14170941.html