151. 表达式计算4 AcWing
标签:bsp for get txt rgba 技巧 就是 表达式计算 wrong
原题链接
一看题目基本就是栈了,这里配Y总视频可以get到一些小技巧,比如给整个表达式加上(),这样就不用在字符串达到底端时,再判断栈空.
本道题会有多余的括号出现,比如((((((-1),(2+3))))) 我们可以参考上面的技巧,在遍历字符串前给字符串加上足够的左括号,这样就可以避免有多余)而(不够的情况.
本题坑点:
- -判断是负数还是减号
- 数字有多位
- 负号后面可能是个(),这时候我们要当作-号计算,被减数是0(这种情况比较特殊,我们要先当作负号,把0装入栈再当作减号计算)
- 这里的负号因为那个特殊情况比较难判断,我们可以换成!减号的情况(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
评论