1696波兰表达式

1696:逆波兰表达式

总时间限制:
1000ms
内存限制:
65536kB
描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
提示
可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在math.h中。
此题可使用函数递归调用的方法求解。
来源
计算概论05
(非递归)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 using namespace std;
 5 void px(double ans[],int t,int oo)
 6 {
 7     for(int l=t;l<oo;l++)
 8     {
 9         double p=ans[l+1];
10         ans[l]=p;
11         ans[l+1]=0;
12     }
13 }
14 int main()
15 {
16     char s[110],k[110];
17     gets(s);
18     double ans[110];
19     int len=strlen(s),i=0,n=0,lens=0,lenans=0;
20     while(i<len)
21     {
22         if(s[i]>=‘0‘&&s[i]<=‘9‘||s[i]==‘.‘)
23         {
24         while(s[i]>=‘0‘&&s[i]<=‘9‘||s[i]==‘.‘)
25         {
26             k[n]=s[i];
27             i++;n++;
28         }
29         ans[lenans]=atof(k);
30         lenans++;
31         memset(k,0,sizeof(k));
32         n=0;
33         }
34         else i++;
35
36     }
37     for(int j=len-1;j>=0;j--)
38     {
39         if(s[j]==‘ ‘&&s[j+1]!=‘+‘&&s[j+1]!=‘-‘&&s[j+1]!=‘/‘&&s[j+1]!=‘*‘)
40         {
41             lens++;
42         }
43         else
44         {
45             if(s[j]==‘+‘||s[j]==‘-‘||s[j]==‘/‘||s[j]==‘*‘)
46             {
47                 switch(s[j])
48                 {
49                     case ‘+‘:ans[lenans-lens]+=ans[lenans-lens+1];px(ans,lenans-lens+1,lenans-1);break;
50                     case ‘-‘:ans[lenans-lens]-=ans[lenans-lens+1];px(ans,lenans-lens+1,lenans-1);break;
51                     case ‘*‘:ans[lenans-lens]*=ans[lenans-lens+1];px(ans,lenans-lens+1,lenans-1);break;
52                     case ‘/‘:ans[lenans-lens]/=ans[lenans-lens+1];px(ans,lenans-lens+1,lenans-1);break;
53                 }
54             }
55         }
56     }
57     printf("%lf",ans[0]);
58     return 0;
59 }

(递归)

 1 #include<cstdio>
 2 #include<cstdlib>
 3 using namespace std;
 4 double js()
 5 {
 6     char t[20];
 7     scanf("%s",t);
 8     switch(t[0])
 9     {
10         case ‘+‘:return js()+js();
11         case ‘-‘:return js()-js();
12         case ‘*‘:return js()*js();
13         case ‘/‘:return js()/js();
14         default :return atof(t);
15     }
16 }
17 int main()
18 {
19     printf("%lf",js());
20     return 0;
21 }

时间: 2024-10-14 10:57:25

1696波兰表达式的相关文章

AC日记——逆波兰表达式 openjudge 3.3 1696

1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用pr

逆波兰表达式

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用prin

逆波兰表达式(栈,递归)

1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用pr

noi1696 逆波兰表达式

1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间

递归--练习10--noi1696逆波兰表达式

递归--练习10--noi1696逆波兰表达式 一.心得 递归大法好 二.题目 1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

求解逆波兰表达式的值

题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Some examples:   ["2", "1", "+", "3", "*"

[Leetcode] evaluate reverse polish notation 计算逆波兰表达式

Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are+,-,*,/. Each operand may be an integer or another expression. Some examples: ["2", "1", "+", "3", "*"] -> (

栈的操作实现逆波兰表达式的计算

代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int StackSize; }sqStack; v