码迷,mamicode.com
首页 > 其他好文 > 详细

4132:四则运算表达式求值(栈)

时间:2020-04-11 23:33:43      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:include   lse   时间   5*   小学   color   内存限制   乘法   pow   

总时间限制: 

1000ms
 
内存限制: 
65536kB
描述

求一个可以带括号的小学算术四则运算表达式的值

输入
一行,一个四则运算表达式。‘*‘表示乘法,‘/‘表示除法
输出
一行,该表达式的值,保留小数点后面两位
样例输入
输入样例1:
3.4
输入样例2:
7+8.3
输入样例3:
3+4.5*(7+2)*(3)*((3+4)*(2+3.5)/(4+5))-34*(7-(2+3))
样例输出
输出样例1:
3.40
输出样例2:
15.30
输出样例3:
454.75

 思路:先把中缀表达式转化为后缀表达式,然后再求值

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct node {
 5     double num;
 6     char op;
 7     bool flag;
 8 };
 9 stack <node> s;
10 queue <node> q;
11 map <char,int> mp;
12 string str;
13 void change() {//把中缀表达式转化为后缀表达式
14     node temp;
15     for(int i=0; i<str.length();) {
16         if(str[i]>=0&&str[i]<=9&&i<str.length()||str[i]==.) {
17             temp.num=0;
18             temp.flag=1;
19             while(str[i]>=0&&str[i]<=9&&i<str.length()) {
20                 temp.num=temp.num*10+(str[i]-0);
21                 i++;
22             }
23             if(str[i]==.) {
24                 i++;
25                 int ii=0;
26                 while(str[i]>=0&&str[i]<=9&&i<str.length()) {
27                     ii++;
28                     temp.num+=pow(0.1,ii)*(str[i]-0);
29                     i++;
30                 }
31             }
32             q.push(temp);
33         } else {
34             if(str[i]==(||s.empty()||mp[str[i]]>mp[s.top().op]) {
35                 temp.flag=0;
36                 temp.op=str[i];
37                 s.push(temp);
38                 i++;
39             } else if(str[i]==)) {
40                 while(s.top().op!=() {
41                     q.push(s.top());
42                     s.pop();
43                 }
44                 i++;
45                 s.pop();
46             } else {
47                 while(!s.empty()&&mp[str[i]]<=mp[s.top().op]&&s.top().op!=() {
48                     q.push(s.top());
49                     s.pop();
50                 }
51                 temp.flag=0;
52                 temp.op=str[i];
53                 s.push(temp);
54                 i++;
55             }
56         }
57     }
58     while(!s.empty()) {
59         q.push(s.top());
60         s.pop();
61     }
62 }
63 double cal() {//对后缀表达式进行计算
64     double a1,a2;
65     node temp,now;
66     while(!q.empty()) {
67         now=q.front();
68         q.pop();
69         if(now.flag==1) {
70             s.push(now);
71         } else {
72             a2=s.top().num;
73             s.pop();
74             a1=s.top().num;
75             s.pop();
76             if(now.op==+)temp.num=a1+a2;
77             else if(now.op==-)temp.num=a1-a2;
78             else if(now.op==*)temp.num=a1*a2;
79             else if(now.op==/)temp.num=a1/a2;
80             temp.flag=1;
81             s.push(temp);
82         }
83     }
84     return s.top().num;
85 }
86 int main() {
87     mp[+]=mp[-]=1;
88     mp[*]=mp[/]=2;
89     cin>>str;
90     while(!s.empty())s.pop();
91     change();
92     printf("%.2lf\n",cal());
93     return 0;
94 }

 

4132:四则运算表达式求值(栈)

标签:include   lse   时间   5*   小学   color   内存限制   乘法   pow   

原文地址:https://www.cnblogs.com/aiqinger/p/12682734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!