【NYOJ-35】表达式求值——简单栈练习

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

假设表达式可以简单定义为:

1. 一个正的十进制数 x 是一个表达式。

2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。

3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。

4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。

例如, 表达式 max(add(1,2),7) 的值为 7。

请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。

输入
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10) 
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出
输出有N行,每一行对应一个表达式的值。
样例输入
3
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
样例输出
3
999
200
【代码】
  
 1 #include<iostream>
 2 #include<string.h>
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<stack>
 6 using namespace std;
 7
 8 stack<int> s;
 9
10 int min(int p,int q){
11 //    if(p > q) return q;
12 //    else return p;
13     return p >= q ? q : p;
14 }
15
16 int max(int p,int q){
17 //    if(p > q) return p;
18 //    else return q;
19     return p >= q ? p : q;
20 }
21
22 int add(int p,int q){
23     return p+q;
24 }
25
26 void reverse(char a[]){
27     char b[405];
28     memset(b,0,sizeof(b));
29     strcpy(b,a);
30     for(int i = 0;i < strlen(a);i++)
31         a[i] = b[strlen(b)-i-1];
32 }
33 int main(){
34     int n;
35     char a[305],str[305];
36     scanf("%d",&n);
37     getchar();
38     while(n--){
39         int k = 0,ex = 0;
40         gets(a);
41         memset(str,0,sizeof(str));
42         if(a[strlen(a)-1] != ‘)‘){
43             printf("%s\n",a);
44             continue;
45         }
46         for(int i = strlen(a) - 1; i >= 3;i--){
47             if(a[i] == ‘)‘) continue;
48             if(a[i] != ‘,‘ && a[i] != ‘(‘) str[k++] = a[i];
49             if(a[i-1] == ‘,‘ || a[i-1] == ‘(‘){
50                 reverse(str);
51                 ex = atof(str);
52                 k = 0;
53                 memset(str,0,sizeof(str));
54                 s.push(ex);
55             }
56             if(a[i] == ‘(‘){
57                 int p,q; //获得栈中数据
58                 p = s.top(); s.pop();
59                 q = s.top(); s.pop();
60                 switch(a[i-1]){
61                     case ‘d‘: s.push(add(p,q)); i-=3; continue;
62                     case ‘n‘: s.push(min(p,q)); i-=3; continue;
63                     case ‘x‘: s.push(max(p,q)); i-=3; continue;
64                 }
65             }
66         }
67         printf("%d\n",s.top());
68     }
69     return 0;
70 }

【总结】

  字符串转为双精度数值:

1 //语法:
2  #include <stdlib.h>
3  double atof( const char *str );
4 //功能:将字符串str转换成一个双精度数值并返回结果。参数str必须以有效数字开头,但是允许以“E”或“e”除外的任意非数字字符结尾。例如:
5 //x = atof( "42.0is_the_answer" );
6 //x的值为42.0.

  const:

    关键字const用来告诉编译器一个一旦被初始化过的变量就不能再修改

    const int a=5; 与 int const a=5; 等同

    类名 const 对象名 与 const 类名 对象名 等同

  

时间: 2024-08-30 02:51:53

【NYOJ-35】表达式求值——简单栈练习的相关文章

NYOJ 35 表达式求值

一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达式 第二步,然后再使用一个stack,计算后缀表达式的结果.这一步非常easy出错,考虑到浮点数的问题. */ #include <iostream> #include <string> #include <cstring> #include <cstdio>

NYOJ35 表达式求值 【栈】

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2/4=",程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以"

表达式求值_栈

问题 C: 表达式求值 时间限制: 3 Sec  内存限制: 128 MB提交: 1  解决: 1[提交][状态][讨论版] 题目描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧.比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10).每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每

表达式求值 (栈应用)

简单计算器 Description 计算一个算术表达式的值.(式子中每个数都是一位数,且除法运算时整除,即3/2=1.输入数据保证每个表达式合法.) Input 有多组测试样例.一个算术表达式占一行. Output 输出表达式的值. Sample Input 1+1 2*3 Sample Output 2 6 分析:就是一个含有加减乘除的表达式,并且不含有括号,计算其值.明明是很简单的表达式求值,愣是让我水了几个小时,也是醉了...看来真是老了 表达式求值:1.先按照计算法则,给出各运算符的优先

Matrix Chain Multiplication(表达式求值用栈操作)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1382    Accepted Submission(s): 905 Problem Description Matrix mul

河南省第四届acm省赛 表达式求值(栈的应用)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 假设表达式可以简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y

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

总时间限制: 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  思路:先把中缀表

leetcode 150. 逆波兰表达式求值(栈)

根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除数为 0 的情况. 示例 1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9 示例 2: 输入: [&qu

中缀表达式求值问题(栈的应用)

1 #include <iostream> 2 #include<stdlib.h> 3 4 using namespace std; 5 6 #define STACK_INIT_SIZE 100 7 #define STACKINCREASE 10 8 9 //为了简化函数,数据栈和符号栈用了一种结构体(虽然我知道可以用共用体解决问题,嫌烦), 10 //由此导致的后果是接下来所有的运算过程中不允许出现小数,而且由于是利用ASCII表来储存整数, 11 //所以要求运算数以及运