计算(calc.cpp) 这题我搞了2晚上qwq

终于会了!可喜可贺!可喜可贺!
 

计算(calc.cpp)

【问题描述】
小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)
【输入】
输入文件calc.in共1行,为一个算式。
【输出】
输出文件calc.out共1行,就是密码。
【输入样例】calc.in
1+(3+2)*(7^2+6*9)/(2)
【输出样例】calc.out
258
【限制】
100%的数据满足:算式长度<=30 其中所有数据在231-1的范围内。
 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<string>
 5 #include<cstring>
 6 
 7 using namespace std;
 8 
 9 int number[101],i=0, p=1;
10 char symbol[101],s[256],t[256];
11 
12 void push() { //算符入栈运算
13     symbol[++p]=s[i];
14 }
15 
16 void pop() { //运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算
17     switch (symbol[p--]) { //运算完成之后扔掉运算符,也标志着需要运算的数已经运算完成
18         case '+': {
19             number[p]+=number[p + 1];
20             break;
21         }
22         case '-': {
23             number[p]-=number[p + 1];
24             break;
25         }
26         case '*': {
27             number[p]*=number[p + 1];
28             break;
29         }
30         case '/': {
31             number[p]/=number[p + 1];
32             break;
33         }
34         case '^': {
35             number[p]=pow(number[p],number[p + 1]);
36         }
37     }
38 }
39 
40 bool can() { //判断运算符的优先级别,建立标志函数,能否进行运算
41     if ((s[i]=='+'||s[i]=='-')&&symbol[p]!='(')//如果不是‘(’,则需要出栈,因为+与-的运算优先级别较低,仅仅比‘(’大
42         return 1;
43     if ((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/'))
44 //若遇到乘除且运算符数组中对应的恰好是乘除,则需要出栈
45         return 1;
46     return 0;
47 }
48 
49 bool judge(char s[256]) {
50     int top=0,i=0;
51     while (s[i]!='@') {
52         if (s[i]=='(')top++;
53         if (s[i]==')') {
54             if (top>0) top--;
55             else return 0;
56         }
57         i++;
58     }
59     if (top!=0) return 0; //检测栈是否为空。不空则说明有未匹配的括号
60     else return 1;
61 }
62 
63 int main() {
64     gets(s);
65     if(judge(s)==0) {
66         cout<<"NO";
67         return 0;
68     }
69 
70     s[strlen(s)]=')';
71     symbol[p]='(';
72     while (i<strlen(s)) {
73         while (s[i]=='(') { //左括号处理,压入左括号,有了左括号才能进行与右括号的匹配 while (symbol[p]!=‘(‘)
74             push();
75             i++;
76         }
77         int x=0;
78         while (s[i]>='0'&&s[i]<='9') //取数入操作数栈
79             x=x*10+s[i++]-'0';
80         number[p]=x;
81         do {
82             if (s[i]==')') { //当右括号后面还有右括号时处理
83                 while (symbol[p]!=')')
84                     pop();//当括号内还有算式没有算完时进行运算
85                 number[--p]=number[p + 1];//当运算完成以后左括号已经没有意义,所以将指针p移向前一个运算符,并复制所得的结果
86             } else {
87 //根据标志函数值作运算符入栈或出栈运算处理
88                 while (can())
89                     pop();// 当可以进行运算时运算,然后压入一个运算符
90                 push();
91             }
92             i++;
93         } while (i<strlen(s)&&s[i-1]==')');//当检测到右括号时,可以运算括号内的内容
94     }
95     printf("Result=%d", number[0]);//这个是建立在最后有‘@’的情况下。因为所有的运算全部是建立在括号之内的,所以随着运算符的减少(运算符减少同时标志着需要操作的数减少)和最后的p--,结果一定保存在number[0]内
96 //printf("Result=%d",number[1]);
97 //如果需要不输入‘@’的运算式,则只需把从number【0】输出改为number【1】就好啦~
98     return 0;
99 }

如果运气好也是错,那我倒愿意错上加错!

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6636754.html