HJ54 表达式求值
题目:https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d?tpId=37&tqId=21277&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
题意:给一个包含+ - * / ( )的表达式,求值
栈的基础应用。
明明是“基础题”,却感觉暴露了自己的基础很差,代码写得丑陋无比
不行,我得重构一下> <
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[110],fuhao[110]; 4 int sum=0,l,top_shuzi=0,shuzi[110],top_fuhao=0; 5 int kuohao[110],top_kuohao=0; 6 void init(){ 7 scanf("%s",s); 8 l=strlen(s); 9 return; 10 } 11 void Jisuan(int f,int t){ 12 int sz[110],w=top_fuhao-(t-f)+1,top=0,tpjj=0; 13 sz[++top]=shuzi[f]; 14 char jj[110]; 15 for(int k=f+1;k<=t;k++){ 16 if(fuhao[w]=='*'){ 17 sz[top]*=shuzi[k]; 18 } 19 if(fuhao[w]=='/'){ 20 sz[top]/=shuzi[k]; 21 } 22 if(fuhao[w]=='+'||fuhao[w]=='-'){ 23 jj[++tpjj]=fuhao[w]; 24 sz[++top]=shuzi[k]; 25 } 26 w++; 27 top_fuhao--; 28 } 29 int x=sz[1]; 30 for(int k=2;k<=top;k++){ 31 if(jj[k-1]=='+'){ 32 x+=sz[k]; 33 } 34 else x-=sz[k]; 35 } 36 shuzi[f]=x; 37 top_shuzi=f; 38 return; 39 } 40 void Work(){ 41 for(int i=0;i<l;){ 42 if(s[i]=='('){ 43 kuohao[++top_kuohao]=top_shuzi+1; 44 i++; 45 } 46 int x=0,f=0; 47 while(s[i]>='0'&&s[i]<='9'){ 48 x=x*10+s[i]-'0'; 49 i++; 50 f=1; 51 } 52 if(f) shuzi[++top_shuzi]=x; 53 if(s[i]=='-'){ 54 if((s[i-1]<'0'||s[i-1]>'9')&&s[i-1]!=')'){ 55 i++; 56 x=0; 57 while(s[i]>='0'&&s[i]<='9'){ 58 x=x*10+s[i]-'0'; 59 i++; 60 } 61 shuzi[++top_shuzi]=-x; 62 } 63 } 64 if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){ 65 fuhao[++top_fuhao]=s[i]; 66 i++; 67 } 68 if(s[i]==')'){ 69 Jisuan(kuohao[top_kuohao],top_shuzi); 70 top_kuohao--; 71 i++; 72 } 73 } 74 if(top_shuzi>1)Jisuan(1,top_shuzi); 75 return; 76 } 77 int main(){ 78 init(); 79 Work(); 80 cout<<shuzi[1]; 81 return 0; 82 }
网上搜了一下,原来这题对C++er来说并不算简单题,真正爽的只有python,一个eval函数解决T_T
看到了这位大佬的代码:https://blog.csdn.net/HPL__001/article/details/128781067
好优雅好喜欢quq
1 #include <iostream> 2 #include <algorithm> 3 #include <stack> 4 #include <string> 5 using namespace std; 6 7 //运算符优先级比较,括号优先级最高,然后是乘除,再加减 8 bool priority(const char &a,const char &b){ 9 if(a == '(') return false; 10 if(((a == '+')||(a == '-'))&&((b == '*')||(b == '/'))) 11 return false; 12 return true; 13 } 14 15 //根据栈顶运算符弹出两个元素进行运算,并把结果压入数字栈顶 16 void compute(stack<int> &si,stack<char> &sc){ 17 int b = si.top(); 18 si.pop(); 19 int a = si.top(); 20 si.pop(); 21 //运算符栈顶 22 char op = sc.top(); 23 sc.pop(); 24 if(op == '+') a = a + b; 25 else if(op == '-') a = a - b; 26 else if(op == '*') a = a * b; 27 else if(op =='/') a = a / b; 28 //计算结果压入数字栈顶 29 si.push(a); 30 } 31 32 int getResult(string &str){ 33 stack<int> si; 34 stack<char> sc; 35 //给整个表达式加上() 36 str = "("+str+")"; 37 bool flag = false; 38 for(int i = 0;i < str.size(); ++i){ 39 //遇到左括号假如到运算栈 40 if(str[i]=='('){ 41 sc.push('('); 42 } 43 //遇到右括号 44 else if(str[i] == ')'){ 45 //弹出开始计算,直到遇到左括号 46 while(sc.top() != '('){ 47 compute(si,sc); 48 } 49 //弹出左括号 50 sc.pop(); 51 } 52 //运算符比较优先级 53 else if (flag){ 54 while(priority(sc.top(),str[i])){ 55 compute(si,sc); 56 } 57 //现阶段符号入栈等待下次计算 58 sc.push(str[i]); 59 flag = false; 60 } 61 //数字 62 else{ 63 //开始记录 64 int j = i; 65 //正负号 66 if(str[j] == '+'||str[j] == '-') i++; 67 while(isdigit(str[i])){ 68 i++; 69 } 70 //截取数字部分 71 string temp = str.substr(j,i - j); 72 si.push(stoi(temp)); 73 //注意外层i还会+1,所以这里-1 74 i--; 75 //数字完了肯定是符号 76 flag = true; 77 } 78 } 79 //返回栈顶元素,为最终结果。 80 return si.top(); 81 } 82 int main() { 83 string str; 84 cin >> str; 85 86 cout << getResult(str) << endl; 87 } 88
这是大佬的代码> <学会了