计算(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 }