连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35
表达式求值
时间限制:3000 ms | 内存限制:65535 KB
难度:4
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
2 1.000+2/4= ((1+2)*5+1)/4=
1.50 4.00
#include<stdio.h> #include<string.h> #define M 1010 char str[M],*pstr[M]; int zuo[M],you[M],op[M],nc,pn,n; int buildtree(int x=0,int y=strlen(str)-1) { int u,i,c1=-1,c2=-1,p=0,ismun=1; for(i=x;i<y;i++) { switch(str[i]) { case '(':p++;ismun=0;break; case ')':p--;ismun=0;break; case '+':case '-':ismun=0;if(p==0)c1=i;break; case '*':case '/':ismun=0;if(p==0)c2=i;break; } } if(ismun) { pstr[pn++]=str+x; return(n--); } if(c1<0)c1=c2; if(c1<0)return(buildtree(x+1,y-1)); u=++nc; zuo[u]=buildtree(x,c1); you[u]=buildtree(c1+1,y); op[u]=str[c1]; return(u); } float findtree(int n=1) { float a,b; if(zuo[n]>0)a=findtree(zuo[n]); else sscanf(pstr[-zuo[n]],"%f",&a); if(you[n]>0)b=findtree(you[n]); else sscanf(pstr[-you[n]],"%f",&b); switch(op[n]) { case '*':return(a*b); case '/':return(a/b); case '+':return(a+b); case '-':return(a-b); } } int main() { int T; scanf("%d",&T); while(T--) { nc=pn=n=0; scanf("%s",str); buildtree(); printf("%.2lf\n",findtree()); } return(0); }
相关推荐
使用二叉树来表示和求解表达式,不仅简化了表达式的解析过程,提高了计算效率,还便于理解和实现更复杂的数学表达式求值算法。通过对表达式的合法性检查、构建二叉树、遍历和求值等步骤的详细说明,我们可以深入理解...
- **C++/Java**:可以使用递归函数或者栈来实现表达式求值,例如使用`std::stack`或自定义堆栈类。 - **Python**:Python的`eval()`函数可以直接执行字符串表达式,但可能存在安全风险。自定义求值函数更安全,...
本文将深入探讨一个用C语言实现的表达式求值程序,该程序特别强调了对浮点数(float型)和乘方运算的支持。 首先,C语言是一种强大的系统级编程语言,适合实现底层的算法和数据结构。在这个表达式求值的程序中,...
在Java编程语言中,表达式求值是一项基本且重要的任务,尤其在动态计算、脚本解析或编译器实现等领域。"Java表达式求值2.0"可能是指一个优化过的版本,用于更高效地处理Java中的数学或逻辑表达式。这个版本可能是...
表达式求值有两种主要方法:前缀表达式(波兰表示法)、后缀表达式(逆波兰表示法)和中缀表达式(人们通常使用的运算符在变量之间的形式)。 1. **前缀表达式**:运算符位于操作数之前,如`+ a b`代表`a + b`。...
POJ2014考研试题表达式·表达式树·表达式求值答案
静态栈实现表达式求值的知识点总结 一、静态栈的定义和基本操作 静态栈是一种数据结构,用于存储和管理元素的集合。静态栈可以通过 Push 和 Pop 操作来实现元素的添加和删除。 * 静态栈的定义:静态栈可以用...
本项目涉及的是使用C++语言实现一个简单的表达式求值器,它能够接收并解析用户输入的数学表达式,然后计算出其结果。下面我们将详细探讨这个主题。 首先,我们关注的是“表达式”。在编程语境中,表达式是能够产生...
例如,解析表达式时,通常使用语法树(也称为抽象语法树,AST),这是一种树形数据结构,其中每个节点代表一个操作或值,而边表示操作与操作数之间的关系。通过遍历这个树,我们可以顺序地评估每个节点,从而求得...
此外,更高效的求值策略,如后缀表达式(逆波兰表示法)或使用解析树,也是优化表达式求值性能的常见手段。 总的来说,理解并实现表达式求值是C++学习过程中的一个重要环节,它涉及到字符串处理、栈操作、运算符...
在编程领域,数学表达式求值是一个常见的任务,特别是在计算机科学和软件工程中。这个程序是用C语言编写的,其目标是解析并计算用户输入的数学表达式。以下是一些关于这个主题的重要知识点: 1. **表达式解析**:在...
这个程序,"CCalculator",是用C++语言实现的一个表达式求值器,它可能是用于处理数学表达式的计算。下面将详细讨论表达式求值的基本原理、C++中的实现方法以及可能涉及的数据结构。 1. **表达式求值**:表达式求值...
本篇文章将深入探讨如何使用Java实现一个能够处理四则运算的表达式求值器。 首先,我们需要理解表达式求值的基本概念。表达式通常包含数字、运算符(如加号"+"、减号"-"、乘号"*"、除号"/")以及括号"()",它们通过...
本文将深入探讨如何使用MFC来实现一个算术表达式求值的功能,以及涉及到的相关数据结构。 首先,理解MFC中的算术表达式求值通常涉及到解析和计算两个主要步骤。解析是将输入的字符串形式的算术表达式转化为可执行的...
后缀表达式避免了括号的使用,使得求值过程更加直观。 3. **符号表**:存储变量名及其对应的值,便于查找和更新变量状态。 三、源代码实现 源代码实现通常分为两个阶段:解析和求值。解析阶段将源代码字符串转换...
- 表达式树的构建和求值 - 动态规划在求解复杂表达式中的应用 - 自定义运算符的处理 - 异常处理,如除数为零的情况 通过理解和实践表达式求值,你可以深化对数据结构和算法的理解,这对于成为一名优秀的程序员至关...
本资源主要介绍了使用C++语言实现表达式求值的数据结构,包括栈的定义和实现、表达式求值算法的设计和实现等内容。 数据结构: 1. 栈的定义和实现:在本资源中,栈是使用C++语言实现的,栈类中包括成员变量:元素...
在编程领域,表达式求值是一项基础且重要的任务,它涉及到如何解析和计算数学或逻辑表达式的值。这里我们关注的是一个简单的计算器程序,它能够处理整数表达式,并支持基本的算术运算以及括号的使用。让我们深入探讨...
- **求值**:遍历表达式树或执行栈操作来计算结果。 在这个演示项目中,可能使用了栈来处理中缀表达式,通过压栈、出栈操作来模拟运算符的优先级。每个运算符的处理都会涉及二元或一元操作,而变量可能需要预先存储...