表达式求解

0.功能:

计算一个多层次表达式

例如:

(((((6)+(5)+(4))-(3))*(2))/(1)) = ?

((((1)or(0)xor(2)and(not(-1)))) = ?

1.原理:

参考正则表达式解析,存储结构,和xml树形结构文件解析的思路,创建树形算式结构。

2.流程:

第一步:解析表达式

<1>.遇到‘(‘创建一个节点。

<2>.遇到‘(‘返回上一层。

<3>.遇到其他填入值。

第二步:创建结构

结构图

3.应用

求解出一个复杂计算条件计算值,可以是数值,可以是布尔值

4.代码

5.扩展

<1> ([1]((((6)+(5)+(4))-(3))*(2))/(1)) = ?,加入错误分析,如果错误舍弃局部结构。

<2> (((((@192.168.0.1)+(5)+(4))-(3))*(2))/(1)) = ? ,丰富一般取值的途径。

<3> (max((1) , (2))) = 2 ?,增加更多的算法。

这些需求都可以在源代码基础上方便扩展。

时间: 2024-10-11 17:36:59

表达式求解的相关文章

表达式求解程序(CPP实现)

/** *    This is a program for solve mathematical expression. Just like: *            "1+4*3/2+22*(3+2*(3-4))" * *    To solve this problem, Let us see it by a view of priority. The rules as following: *        1). the priority of plus sign is 1

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶

后缀表达式求解

问题描述: 后缀表达式也叫逆波兰式,中缀到后缀举例: ( 4 + 2 ) * ( 3 + 6 ) => 4 2 + 3 6 + * (3 + 4 / 2) - 5 => 3 4 2 / + 5 - 问题是求解类似以上右侧的后缀表达式. 思路1(递归): 1. 从右向左扫描 2. 因为后缀表达式里都是双目运算符,且没有括号,所以遇到操作符可以递归求解,例如遇到乘号: case '*': return exp() * exp(); 思路2(栈): 1. 维护数字栈 2. 从左向右扫描,遇到数字则入

前缀表达式求解

问题描述: 前缀表达式也叫波兰表达式,是将操作符前置的一种写法. 中缀到前缀示例: ( 4 + 2 ) * ( 3 + 6 ) =>  * + 4 2 + 3 6 (3 + 4 / 2) - 5 => - + 3 / 4 2 5 思路1(递归): 1. 从左向右扫描 2. 因为前缀表达式里都是双目运算符,且没有括号,所以遇到操作符可以递归求解,例如遇到乘号: case '*': return exp() * exp(); 思路2(栈): 1. 维护数字栈 2. 从右向左扫描,遇到数字则入栈,遇

逆波兰式与表达式求解

/*************** 逆波兰式即后缀表示法 预处理 ---- 中序表达式->逆序表达式(infix to postfix) 算法: while(表达式非空) if (遇到操作数) 直接输出 else if (遇到操作符op) op是( 直接入栈s op是) s.push输出,直到( op是四则运算,则 if (s为空 || s.top为( || op 优先级高于 s.top) op 入栈 else s.push输出 if (!s.empty) s.push输出 计算 算法: if (

中缀表达式求解

问题描述: 中缀表达式计算,只包含加减乘除以及括号,例如: 2+3*4-5/2 = 11.5 ((2+3*4)-5)/2 = 4.5 思路: 1. 维护两个栈空间:数字栈与符号栈 2. 注意入栈与出栈的规则,符号栈入栈时,根据符号优先级判断是否入栈或出栈. 高优先级符号后入栈时直接放入即可,低优先级符号后入栈时先弹出高优先级符号,优先级如下: ( < +- < * / < ) 普通操作符弹出计算时,只进行一次pop_cal操作. 右括号出栈时,必须循环计算至左括号出栈为止. 边界case

C++的逆波兰表达式的求解

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法.逆波兰记法不需要括号来标识操作符的优先级.逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构和减少计算机内存访问.逆波兰记法和相应的算法由澳大利亚哲学家.计算机学家查尔斯·汉布林(Charle

逆波兰表达式的实现

一般情况下表达式是由操作数和运算符组成,例如算数表达式中通常将运算符放在两个操作数中间,譬如a+b的形式,这种形式称为中缀表达式,那么问题来了,是否有后缀表达,前缀表达式呢??? 对,没错,这些后缀表达,前缀表达式都是由波兰数学家Jan Lukasiewicz提出来的 把运算符写在操作数之前,称为波兰表达式(Polish Expression)或前缀表达式(Prefix Expression),如+AB: 把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish Expressio

运算符和表达式(类型转换)

和其他程序设计语言一样,C语言中表示运算的符号称为运算符.运算符是告诉编译程序执行特定算术或逻辑操作的符号,运算的对象称为操作数. 对一个操作数进行运算的运算符称为单目运算符,对两个操作数进行运算的运算符称为双目运算符,三目运算符对三个操作数进行运算.用运算符和括号可以将操作数连接起来组成表达式. C语言提供了40多个运算符,其中一部分跟其他高级语言相同(例如"+"."?"."*"等运算符),另外的与汇编语言类似,对计算机的底层硬件(如指定的物理