Java教程

中缀转后缀表达式以及后缀表达式计算

本文主要是介绍中缀转后缀表达式以及后缀表达式计算,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string t[100];
 4 int tot=0;
 5 int to_num(string &s)
 6 {
 7     int x=0,f=1;
 8     for(auto &p:s)
 9     {
10         if(p=='-')f=-1;
11         else x=x*10+(p^48);
12     }
13     return x*f;
14 }
15 int main()
16 {
17     unordered_map<char,int>mp;
18     mp['*']=2;
19     mp['/']=2;//如果是给除号自己替换 
20     mp['+']=1;
21     mp['-']=1;
22     string s="16+2*30/4"; //2+(3+4)*5  16+2*30/4
23     stack<char>st;
24     int x=0,ok=0;            
25     for(int i=0;i<s.size();i++)
26     {
27         
28         if(s[i]>='0'&&s[i]<='9')
29         {
30             x=x*10+s[i]-'0';
31             ok=1;
32         }
33         else
34         {
35             if(ok)
36             {
37                 t[tot++]=to_string(x);
38                 x=0;
39                 ok=0;//记录数字
40             }
41             if(s[i]=='(')st.push('(');
42             else if(s[i]==')')
43             {
44                 while(st.top()!='(')//如果是右括号就把运算符加入字符串后面,直到遇到左括号
45                 {
46                     t[tot++]=st.top();
47                     st.pop();
48                 }
49                 st.pop();//把左括号出栈
50             }
51             else 
52             {
53                 if(!st.size()||st.top()=='(')st.push(s[i]);//左括号或者是空栈直接入栈
54                 else
55                 {
56                     while(st.size()&&mp[st.top()]>=mp[s[i]])//如果是运算符,考虑栈顶元素与当前元素的优先级,要保证栈内优先级严格递增
57                     {
58                         t[tot++]=st.top();
59                         st.pop();
60                     }
61                     st.push(s[i]);
62                 }
63             }
64         }
65     }
66     if(x)t[tot++]=to_string(x);
67     while(st.size())
68     {
69         t[tot++]=st.top();
70         st.pop();
71     }
72     //for(int i=0;i<tot;i++)cout<<t[i]<<" ";
    //这里开始后缀表达式的计算
73     stack<int>myst;
74     for(int i=0;i<tot;i++)
75     {
76         if(t[i]=="+"||t[i]=="-"||t[i]=="*"||t[i]=="/")
77         {
78             int x1=0,x2=0;
79             x2=myst.top();
80             myst.pop();
81             x1=myst.top();
82             myst.pop();
83             if(t[i]=="+")myst.push(x1+x2);
84             else if(t[i]=="-")myst.push(x1-x2);
85             else if(t[i]=="*")myst.push(x1*x2);
86             else if(t[i]=="/")myst.push(x1/x2);    
87         }
88         else myst.push(to_num(t[i]));
89     }
90     int ans=myst.top();
91     cout<<ans<<endl;
92     return 0;
93 }

 

这篇关于中缀转后缀表达式以及后缀表达式计算的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!