首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【栈】实现表达式求值(C++)(详解)

【栈】实现表达式求值 思路 && 理解 && 注意 给定一串表达式,字符串类型,依次遍历从头开始遍历每一个位置内容。...进来,反之,pop出栈,运算前面的式子之和(之后判断运算符栈中是否还有内容,并且当前运算符优先级是否小于等于已有的运算符,小于等于就接着运算前面的表达式,完成push当前运算符,反之继续往下遍历push...(lhs == '*' || lhs == '/')) { return true; } return false; } //计算左右操作数+运算符 (运算符求值) int operate...则计算前一个运算符值 { int right = 0; int left = 0; int opt = 0; do {...isLarger(input[i],*getTop(opt_stack)));//自动再往前判断,是否可以对前面的表达式进行运算 //运算符栈不为空 并且当前运算符优先级小于等于栈顶运算符(

24820

c++表达式求值——简易版

主要思想: 有两个栈,一个保存操作数,一个保存操作符 当前字符是数字时,直接入栈 当前字符是操作符时,分2种情况  操作符栈空,直接入栈 操作符栈非空,把当前操作符与栈顶操作符进行优先级比较...若栈顶操作符优先级>=当前操作符,就将操作数栈中前2个操作数拿出来运算,并删除,然后把算出来结果在入操作数栈 最后再将操作符栈里字符退栈,并依次进行计算。...这样最后操作数中剩下那个数就是表达式值 代码: #include #include #include using namespace std; stack op; stack num; int...(char c,int n1, int n2){ /* c:操作符 n1,n2:操作数 返回是n2 c n1 值 */ if (c=='*') return...return n2/n1; if(c=='+') return n2+n1; if(c=='-') return n2-n1; } void compute(string s){//计算表达式

58020
您找到你想要的搜索结果了吗?
是的
没有找到

条件表达式短路求值与函数延迟求值

延迟求值是 .NET一个很重要特性,在LISP语言,这个特性是依靠宏来完成,在C,C++,可以通过函数指针来完成,而在.NET,它是靠委托来完成。...,取决于第一个参数  flag,如果它值为false,那么函数 fun 是永远都不会被求值,所以,这里函数 fun求值被推迟到了方法TestDelayFunton1 内部,而不是在参数计算时候...延迟求值很有用,它可以避免我们无谓计算,比如上面的例子,这样可以节省计算成本,假如 fun求值很耗时的话。...我们注意这一段代码: if(flag) fun(); 其实它等价于一个逻辑表达式: bool result= flag && fun(); 在这个表达式中,fun() 函数是否求值,取决于变量...flag,这个功能叫做“短路”判断,“条件短路”功能正好实现了我们“延迟求值功能,因此,我们可以得到如下推论: 任何时候一个函数fun如果需要延迟求值,那么都可以表示成 一个条件表达式: (Test

93860

应用——表达式求值

概要 表达式求值问题可以说是一个经典问题。具体思路就是首先把输入中缀表达式转换为后缀表达式,然后再根据后缀表达式进行计算求值。...中缀表达式进行遍历,遇到数字进行输出到后缀表达式中 如果遇到运算符,把栈顶元素(前者)栈内优先级与即将入栈元素(后者)栈外优先级进行比较,如前者小,则运算符入栈,否则,则把栈顶元素(前者)出栈并输出到后缀表达式中...---- 后缀表达式求值 后缀表达式进行遍历,如果是数字就入栈,如果是运算符,就连续出栈两次结果进行保存,之后进行相应运算,把运算结果入栈,直至遍历结束,结果为栈顶元素。...---- 下面是具体代码,但是为了减小码量,下面的程序输入数字有如下要求:必须是0-9数字,大于等于10不行,即如表达式:(1+(10-5)*2+2)/2是不合法,10以上数字不能出现。...Transform{ private: char* str; int top; int size; public: //表达式求值构造函数

60110

中缀表达式转换为后缀表达式(逆波兰表达式)并求值

中缀表达式转后缀表达式思路: 1.初始化一个运算符栈s1和存储中间结果List集合s2; 2.从左至右扫描中缀表达式(这里为了方便把中缀表达式字符串依次存放到数组中); 3.遇到操作数时,将其加到...s2,直到遇左括号为止,此时将这一括号丢弃; 6.重复2-5,直到表达式最右边 7.将s1中剩余运算符依次弹出并加入到s2 8.依次输出s2中元素,结果即为中缀表达式对应后缀表达式。...//将中缀表达式转换为后缀表达式求值 import java.util.ArrayList; import java.util.List; import java.util.Stack; public...= 0) { s2.add(s1.pop()); } return s2; } } 后缀表达式求值思路: 从左向右扫描表达式,遇到数字将数字压入数栈...,遇到运算符弹出栈顶两个数,用运算符他们进行相应计算并将结果入栈;重复上述过程直到表达式最右端,最后得出值即为表达式结果(后缀表达式剑法和除法运算是栈底元素- or / 栈顶元素)。

34630

栈在表达式求值应用——逆波兰表达式求值+中缀表达式转后缀表达式

逆波兰表达式(后缀表达式求值 链接: link 这道题目叫做逆波兰表达式求值,那什么是逆波兰表达式呢?...我们可以一起来了解一下: 结合题目中给测试用例给大家解释一下: 我们正常写表达式,就比如题目中这个:(2 + 1) * 3 这种写法叫做中缀算术表达式,即运算符写在操作数中间,但是这种写法计算机是不能直接计算...所以呢,这里就需要我们做一件事情,就是把它变成后缀表达式,其实就是根据优先级对表达式运算符排一个序,并且放到对应操作数后面。...即1和2先进行后面的+,得到结果再和3进行后面的*,得到最终结果。这样就直接从前往后算,不用考虑优先级问题了。 那现在大家逆波兰表达式应该有一个大致了解了。...中缀表达式求值 那大家再来思考一下,如果给一个中缀表达式,我们该如何求它值呢? ,是不是就是上面两种操作结合啊。

8210

数据结构(8)栈应用——求值表达式

应用——求值表达式 今天来写一下栈在求值表达式应用,这部分看了差不多一天了,具体原理基本懂了,代码实现部分只实现了无括号情况下中缀表达式转后缀表达式,因为没找到标准C代码实现,所以一直自己摸索...,今天就来写一写原理以及已经实现代码。...表达式分类 首先表达式分为三类,分别为: 中缀表达式 后缀表达式 前缀表达式 这里中缀,前缀,后缀指的是运算符,中缀表达式就是运算符在两个操作数中间,后缀表达式就是运算符在两个操作数后面。...例如A+B,就是一个中缀表达式,转为前缀表达式就是+AB,后缀表达式就是AB+。求值表达式问题可以转换为两个小问题,分别用栈实现。...其一是给出中缀表达式,转换为后缀表达式,其二是根据后缀表达式,求出表达式值。

30220

数据结构(四):栈应用之表达式求值

1、表达式求值 问题描述: 用户从控制台输入一个数学表达式(所有输入均合法),数学表达式只包含四则运算,程序需输出表达式对应结果,如: 输入:(1+2)*3+4-5 输出:8 解题思路: 涉及到数学符号有...因为左边 + 比右边 + 优先级要高,所以我们在判断符号优先级时候还要带上方向。...1 / 1 1 1 1 -1 1 ( -1 -1 -1 -1 0 0 ) 1 1 1 1 0 0 两个相同优先级符号总是左边优先级比右边高。...如果是操作符,与操作符栈栈顶元素比较 若优先级高于栈顶元素,压入操作符栈 否则取出操作符栈栈顶元素和操作数栈栈顶两个元素进行运算,并将运算结果压入操作数栈中。...继续执行第 4步 判断是否输入结束(遇到换行) 若输入结束,将操作符栈中元素逐个弹出进行运算 否则继续第 2步 返回计算结果 代码请看:栈及其应用

73520

“栈”典型应用—表达式求值(C语言实现)

大家好,又见面了,我是你们朋友全栈君。 表达式求值是程序设计语言编译中一个基本问题。它实现就是“栈”典型应用。本文针对表达式求值使用是最简单直观算法“算符优先法”。...我们都知道算术四则运算运算规则是: 先乘除,后加减。 从左到右计算 先算括号内,再算括号外 表达式组成 任何一个表达式都有操作数、运算符和界定符组成。...“#”,这一“#”表示一个表达式求值完成。...依次读入表达式每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕(OPTR栈顶元素和当前读入字符均为“#”) 代码实现: 首先先熟悉一下栈相关操作...: /*计算整数表达式值 *表达式必须以#结束 *表达式中可以出现多位数字, *表达式中可以出现空格 *运算符包括+,-,*,/,(,) *运算结果可以是多位整数,并以整数形式返回 */

49410

【程序填空】表达式计算(栈应用)C++

题目描述 使用C++自带stack栈模板来实现四则运算表达式求值 算法描述参考第3.2.5节 算法伪代码参考P53-54算法3.4 例如 1....因此改成c++代码是两个操作:a = OPND.top();   OPND.pop(); 3. a = GetTop(OPND)表示获取栈OPND栈顶元素,转成c++代码就是: a = OPND.top...(); 大家主要是改造表达式求值函数EvaluateExpression代码 输入 第一个输入t,表示有t个实例 第二行起,每行输入一个表达式,每个表达式末尾带#表示结束 输入t行 输出 每行输出一个表达式计算结果...,计算结果用浮点数(含2位小数)格式表示 参考代码如下: #include #include using namespace std; int main...- ),那么需要开始计算这个运算符前面的数值,即两次弹出操作数栈栈顶元素用来计算计算运算符是当前运算符栈顶元素。

16530

表达式求值过程中会发生哪些隐藏变化?求值顺序又由什么决定?——详解C表达式求值隐式类型转换,算术转换问题,以及操作符属性

我们写出表达式,在求值过程中,一定是按照我们所想在一步一步运算吗?会不会发生一些我们察觉不到变化呢?任意给定一个表达式,它计算路径一定是确定吗?...表达式求值 表达式求值顺序一部分是由操作符优先级和结合性决定。 同时,有些表达式操作数在求值过程中可能需要转换为其他类型。 一.隐式类型转换——整型提升 1.什么是整型提升呢?...我们来分析一下: 我们看看结果: 三.操作符属性 1.操作符如何控制表达式求值 复杂表达式求值有三个影响因素。 1. 操作符优先级 2. 操作符结合性 3....在计算时候,由于“ * ”比+优先级高,只能保证 “ * ”计算是比+早,但是优先级并不能决定第三个*比第一个+早执行。...3.总结 上面的问题表达式告诉我们: 即使我们知道了所有操作符优先级和结合性,以及其是否控制求值顺序,我们也不能保证任意写一个表达式,它求值顺序就一定是确定,我们写出表达式如果不能通过操作符属性确定唯一计算路径

7110

C++避坑---函数参数求值顺序和使用独立语句将newed对象存储于智能指针中

实际上C++对于这种函数参数求值顺序通常情况下是未指明,也就是说:大部分情况下,编译器能在任何操作数和其他子表达式中以任何顺序求值,并且可以在再次求值同一表达式时选择另一顺序。...为什么C++不把顺序规定清楚呢?实际上这是C++设计者故意而为之,因为C++在平衡功能同时,还要追求高执行效率。...允许编译器在优化中根据实际需要调整实现表达式求值指令顺序,从而达到更高效执行效率。...由于C++中针对函数参数求值顺序未进行明确定义,因此编译器可以根据实际情况来调整上述事情顺序。当编译器采用1、3、2顺序: 调用new Widget()表达式。 调用priority函数。...From N4868, October 2020, Draft 根据新规则,对于函数参数计算不会相互交错。

49210

求值表达式,堆栈,调试陷阱与ORM查询语言设计

1,表达式求值顺序与堆栈结构 “表达式” 是程序语言一个很重要术语,也是大家天天写程序中很常见东西,但是表达式求值顺序一定是从左到右么? ...C/C++语言中没有明确规定表达式运算顺序(从左到右,或是从右到左),这点与C#及Java语言都不同。不过可以确定是,C#表达式求值顺序一定是从左到右。...根据表达式求值顺序,再结合堆栈结构,程序语言就可以知道表达式调用结构,知道方法参数求值顺序,SOD框架恰好利用了这个特征来构建ORM查询语言--OQL 。...聪明读者你可能想到了,这是在利用表达式求值得“副作用”啊,本来只是 user.Age 属性求值而已,但却利用该属性求值过程中引发事件,得到了使用字段信息,然后利用这个信息来构造SQL语句!...“弹出”操作,并且返回了一个新 OQLCompare 对象,根据C#语言“左求值表达式”原则 ,这个新OQLCompare 对象获得了下面的信息: compare.ComparedFieldName

85560

六十三、栈在括号匹配和表达式求值应用

与前缀表达式(例:+ 1 2)或后缀表达式(例:1 2 +)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们普遍用法。...下面问题转为为:如何利用栈实现中缀表达式求值,比如:34+13*9+44-12/3=191 思路:利用两个栈,其中一个用来保存操作数,另一个用来保存运算符。...若比运算符栈顶元素优先级高,就将当前运算符压入栈,若比运算符栈顶元素优先级低或者相同,从运算符栈中取出栈顶运算符,从操作数栈顶取出2个操作数,然后进行计算,把计算结果压入操作数栈,继续比较。...def infix_evaluator(infix_expression : str) -> int : '''这是中缀表达式求值函数 :参数 infix_expression:中缀表达式...# 用一个例子试试,得出了结果 17.0 print(infix_evaluator('9 + ( 3 - 1 * 2 ) * 3 + 10 / 2')) 17.0 上述程序只是使用四则运算表达式进行学习计算

56720
领券