AlenaNuna

导航

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  

这是大佬的代码> <学会了

posted on 2024-09-06 10:19  AlenaNuna  阅读(32)  评论(0编辑  收藏  举报