hdu-1237简单计算器(栈的运用)

http://acm.hdu.edu.cn/showproblem.php?pid=1237

简单的栈的运用。

首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第一个运算符分别压

如个自的栈,然后判取出两个栈头部的元素,判断符号,如果是乘除就用当前数值乘取出的数字(优先),然后将乘后的数压入栈,

如果是加则将数和取出的数按原序入栈,如果减,就把新的数变负,将数和取出的数按原序入栈。

最后栈中所有元素的和就是结果。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<iostream>
 7 #include<stack>
 8 #include<queue>
 9 using namespace std;
10 char a[300];
11 char b[300];
12 double c[300];
13 int main(void)
14 {
15     int n,i,j,k,p,q,l;
16     while(gets(a))
17     {
18         l=strlen(a);
19         if(l==1&&a[0]==‘0‘)
20         {
21             break;
22         }
23         double ss=1;
24         double sum=0;
25         int yy=0;
26         for(i=l-1; i>=0; i--)//从后往前循环分离,这样取数比较容易。
27         {
28             if(a[i]<=‘9‘&&a[i]>=‘0‘)
29             {
30                 sum+=ss*(a[i]-‘0‘);
31                 ss*=10;
32             }
33             else if(a[i]==‘ ‘)
34             {
35                 continue;
36             }
37             else if(a[i]==‘+‘||a[i]==‘-‘||a[i]==‘*‘||a[i]==‘/‘)
38             {
39                 c[yy++]=sum;
40                 sum=0;
41                 ss=1;
42                 b[yy++]=a[i];
43             }
44         }
45         c[yy]=sum;
46         stack<double>que;//数栈
47         stack<char>que1;//字符栈
48         if(yy==0)//特判就一个元素直接输出
49         {
50             printf("%.2f",c[0]);
51         }
52         else
53         {
54             que.push(c[yy]);
55             que1.push(b[yy-1]);
56             for(i=yy-2; i>=0; i-=2)
57             {
58                 char cc=que1.top();//栈顶元素出栈
59                 que1.pop();
60                 double m=que.top();//栈顶元素出栈
61                 que.pop();
62                 if(cc==‘*‘)//判断类型
63                 {
64                     m*=c[i];
65                     que.push(m);
66                 }
67                 else if(cc==‘/‘)
68                 {
69                     m=1.0*m/c[i];
70                     que.push(m);
71                 }
72                 else if(cc==‘+‘)
73                 {
74                     que.push(m);//按原序入栈
75                     que.push(c[i]);
76                 }
77                 else if(cc==‘-‘)
78                 {
79                     que.push(m);//按原序入栈
80                     que.push(0-c[i]);
81                 }
82                 que1.push(b[i-1]);
83
84             }
85             double pp=0;
86             while(!que.empty())//最后栈中元素的和
87             {
88                 pp+=que.top();
89                 que.pop();
90             }
91             printf("%.2f",pp);
92         }
93         printf("\n");
94     }
95     return 0;
96 }
时间: 2024-10-24 15:32:02

hdu-1237简单计算器(栈的运用)的相关文章

HDU 1237 简单计算器(栈)

题目链接 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00

hdu 1237 简单计算器(栈处理)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26553    Accepted Submission(s): 9626 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

HDU 1237 简单计算器(后缀式+栈)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16351    Accepted Submission(s): 5604 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,

HDU 1237 简单计算器

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12832    Accepted Submission(s): 4222 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

Hdu 1237简单计算器

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 21184    Accepted Submission(s): 7599 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

hdu 1237 简单计算器 逆波兰~~

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13852    Accepted Submission(s): 4613 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,

HDU 1237 简单计算器 (栈 )

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<stack> using namespace std; char str[300]; double ans; double chcd(char x) { return (x-'0')*1.0; } double ch(int l,int r) { //printf("%d

HDU 1237 简单计算器(stack)

Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00 13.3

hdoj 1237 简单计算器

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14512    Accepted Submission(s): 4920 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整