pat02-线性结构3. 求前缀表达式的值(25)

02-线性结构3. 求前缀表达式的值(25)

时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式说明:

输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式说明:

输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

样例输入与输出:

序号 输入 输出
1
+ + 2 * 3 - 7 4 / 8 4
13.0
2
/ -25 + * - 2 3 4 / 8 4
12.5
3
/ 5 + * - 2 3 4 / 8 2
ERROR
4
+10.23
10.2


提交代码

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<queue>
 6 #include<vector>
 7 #include<string>
 8 #include<stack>
 9 using namespace std;
10 int main(){
11     //freopen("D:\\input.txt","r",stdin);
12     stack<double> fi;
13     stack<string> input;
14     string s;
15
16     //bool can=true;
17     while(cin>>s){
18         input.push(s);
19     }
20     while(!input.empty()){
21         s=input.top();
22         input.pop();
23         if(s.length()==1&&!(s[0]>=‘0‘&&s[0]<=‘9‘)){
24             double a=fi.top();
25             fi.pop();
26             double b=fi.top();
27             fi.pop();
28             switch(s[0]){
29                 case‘+‘:{
30                     //cout<<"+:  "<<a+b<<endl;
31                     fi.push(a+b);
32                     break;
33                 }
34                 case‘-‘:{
35                     //cout<<"-:  "<<a-b<<endl;
36                     fi.push(a-b);
37                     break;
38                 }
39                 case‘*‘:{
40                     //cout<<"*:  "<<a*b<<endl;
41                     fi.push(a*b);
42                     break;
43                 }
44                 case‘/‘:{
45                     if(b==0){
46                         printf("ERROR\n");
47                         //can=false;
48                         return 0;
49                     }
50                     //cout<<"/:  "<<a/b<<endl;
51                     fi.push(a/b);
52                     break;
53                 }
54                 default:{
55                         printf("ERROR\n");
56                         return 0;
57                 }
58             }
59         }else if((s[0]>=‘0‘&&s[0]<=‘9‘)||(s.length()>1&&!(s[0]>=‘0‘&&s[0]<=‘9‘)&&(s[1]>=‘0‘&&s[1]<=‘9‘))){
60             double cal=1;
61             int i=0;
62             if(s[i]==‘+‘||s[i]==‘-‘){
63                 if(s[i]==‘-‘){
64                    cal=-1;
65                 }
66                 i++;
67             }
68             double intpart=0,decpart=0;
69             while(i<s.length()&&s[i]!=‘.‘){//注意换算
70                 intpart*=10;
71                 intpart+=s[i++]-‘0‘;
72             }
73             i++;
74             int j;
75             for(j=s.length()-1;j>=i;j--){
76                 decpart+=s[j]-‘0‘;
77                 decpart*=0.1;
78             }
79             fi.push(cal*(intpart+decpart));
80         }else{
81             printf("ERROR\n");
82             return 0;
83         }
84     }
85     //cout<<fi.top()<<endl;
86
87     printf("%.1lf\n",fi.top());
88     return 0;
89 }
时间: 2024-10-20 04:37:56

pat02-线性结构3. 求前缀表达式的值(25)的相关文章

PAT 线性结构3. 求前缀表达式的值 栈的应用

题目链接: 前缀表达式求值 题解: 同后缀表达式求值思路: 遇到数值则入栈,遇到操作符则从栈中取出最上面的两个数值进行操作,再将结果入栈,最后得到的栈顶元素则为答案. 前缀表达式从后往前遍历即可. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<stack> using namespace std; int op(char a) { if(a=='+'||a=='-'||a

02-线性结构3. 求前缀表达式的值(25)

02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之

求前缀表达式的值

算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式说明: 输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”. 样例输入与输出: 序号 输入 输出 1 + +

7-21 求前缀表达式的值

7-21 求前缀表达式的值(25 分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式: 输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR. 输入样例: + + 2

【Zhejiang University PATest】02-3. 求前缀表达式的值

算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式说明: 输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”. 样例输入与输出: 序号 输入 输出 1 + +

【PAT】2-3 求前缀表达式的值

求值方法: 对于一个前缀表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此作为一个新的“数字串”并记录下来.一直扫描到表达式的最左端时,最后运算的值也就是表达式的值.例如,前缀表达式“- 1 + 2 3“的求值,扫描到3时,记录下这个数字串,扫描到2时,记录下这个数字串,当扫描到+时,将+右移做相邻两数字串的运算符,记为2+3,结果为5,记录下这个新数字串,并继续

7-21 求前缀表达式的值(25 分)

前缀表达式的计算机求值:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈:重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果.例如前缀表达式"- × + 3 4 5 6":(1) 从右至左扫描,将6.5.4.3压入堆栈:(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈:(3) 接下来是×运算符,因此

3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算前缀表达式的结果值. 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+.-.*.\以及运算数,不同对象(运算数.运算符号)之间以空格分隔. 输出格式说明: 输出前缀表达式的运算结果,精确到小

求前缀表达式的值(25)

这道题用到了栈,所以就用C++来做咯 当然C也可以做,不过就显得麻烦了. /*--------------------------------------*/ 我们把这道题分成几个部分 1. 输入部分 怎么判断输入的是一个运算符还是一个数? 2. 计算部分 前缀表达式如何计算?在什么情况下我们可以说前缀表达式有错,而报出一个"ERROR"? 首先创建了一个表达式栈expression用来存表达式的内容 第一部分的思路是这样的,每次从输入流获取一个字符串string 1.如果string