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

利用栈计算后缀表达式

上篇笔记我们已经知道了后缀表达式以及他的计算方法,本篇我会用代码实现利用栈计算后缀表达式。 计算步骤 初始化一个空栈。...此栈用来对要运算的数字进出使用 如果遇到符号就把栈上的两个元素拿出来计算然后再压栈 遇到数字就压栈,遇到符号就出栈两个数字然后计算 直到表达式结束 代码实现 #include #include...= '-' || c == '*' || c == '/') { return true; } return false; } PerformOperation函数是通过传入的操作符来计算栈上元素的...Isnumber判断参数是否是数字 IsOperator判断是否是操作符 整体逻辑 根据字符串从左面开始扫面(我这里用的是for循环你也可以用其他的循环) 如果是操作符,则pop栈顶两个元素进行运算...如果是数字,则把字符转成整数(因为后续要参加计算)并入栈,经过反复计算压栈,最后留在栈顶的就是我们要的结果。 eg:计算931-2*+52/+

18130

利用栈实现中缀表达式计算

如下图 根据用户输入的表达式,得出计算结果 思路分析 本题看似简单,实则不然,要实现这个功能我们不能简单的直接将这个字符串丢给程序 如下 int a = 7*2*2-5+1-5*3-3 // 3...我们要模拟计算机是如何解析,并计算出这样一个字符串的结果。...则直接入符号栈 4.当表达式遍历完毕时,就顺序的从数栈和符号栈中pop出相应的数和符号,并进行运算 5.最后数栈中只有一个数字,即最后的结果 图示 如下例计算 3+2*6-2 第一次扫描时,发现是数字,...,我们还得给栈添加几个方法 1.查看栈顶中的元素 2.计算符号优先级 3.判断是否为运算符 4.计算方法 ......,就顺序的从数栈和符号栈中pop出相应的数和符号进行计算 while (true){ //当符号栈为空时,说明计算到最后的结果了,数栈中只有一个数字即结果

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

    【CPP】栈,后缀表达式与计算

    我们平时计算时列的计算式叫做中缀表达式,即运算符放在两个运算数中间的计算式(例:1+1)。...但是,这样的式子计算机并不能很好的理解,在遇到有括号加入时就会更难进行编程,于是在这样的需求下,另一种计算式被发明了:后缀表达式。...用移动的p_now指针来标识栈顶的位置。 接下来的重点,是如何将中缀表达式转化为后缀表达式。...首先,我们初始化两个栈,一个用于存放转换完成的式子(目标栈),另一个用于暂时存放操作符(操作符栈),并用一个字符指针来扫描字符串,用一个int来表示目前的扫描状态。 ?...这样我们便完成了转换中缀表达式的步骤了。然后就是如何计算后缀表达式呢。

    1K20

    C语言-用栈实现表达式求值(顺序栈)

    (In) 表达式求值函数(evaluateExpression) 其他:操作符栈(OPTR),操作数栈(OPND) ---- 谈谈我遇到的问题: 1.该选择数字栈还是字符栈?...运算数是整型,而运算符是字符型,若选用字符栈,存入操作数时只能以‘0’–‘9’的字符形式存入,那么意味着无法存取两位以上的数字,也无法运算两位以上的数字,因为运算过程中的中间值超过两位也将无法转化成字符形态入栈计算...用gets(str);或者scanf进行字符串读入表达式后,存储方式如下: 多位数的存储方式: 我们可以通过str[i]进行逐位的访问,通过i++;实现逐位的偏移,那么就可以写成str...此时我们就成功的用归并将34读取入栈 ,接下来再看4位的数5473如何读取,首先X1读取5,归并至X2(第一次归并,此时X1=5;X2=5),接着让X1读取4,识别到X1是数字,归并至X2(第二次归并,...此算法用于计算整型,若要计算浮点数,把相应的类型更换成double即可实现。 算法运算逻辑是先以字符型读入字符数组中,再将字符型转换为整型存入数字栈中。

    1.9K10

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

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

    20130

    栈的应用----算术表达式计算问题(中缀转后缀,后缀计算)

    栈的应用----算术表达式计算问题(中缀转后缀,后缀计算) 问题引入:算术表达式计算是编译系统中的一个基本问题,其实现方法是堆栈的一个典型应用。任何一个算术表达式都是由操作数、运算符和分界符组成的。...算术表达式的计算分为两步: 中缀表达式转为后缀表达式 后缀表达式的计算。...4.计算过程 二、后缀表达式的计算 1.算法思想: 设置一个堆栈存放操作数,从左至右依次扫描后缀算术表达式,每读到一个操作数就将其进栈,每读到一个运算符就从栈顶取出两个操作数施以改运算符所代表的运算操作...,并把该运算结果作为一个新的操作数入栈,此过程一直进行到后缀算术表达式读完,最后栈顶的操作数就是改后缀算数表达式的运算结果。...可以看到,上述的分析过程和结果都正确,其实熟悉编译原理的同学可以直接用“移进”和“规约动作”实现中缀算数表达式到后缀算数表达式的转换。

    1.3K20

    栈的应用中缀表达式转换为后缀表达式后缀表达式的计算

    中缀表达式转换为后缀表达式 后缀表达式 做数学运算时,经常使用的是中缀表达式,即“操作数 运算符 操作数”。在计算机处理的时候更习惯后缀表达式,即“操作数 操作数 运算符”。...例如a + b * c转换为后缀表达式a b c * +,使用栈可以将中缀表达式转换为后缀表达式,具体的方法为: 扫描到数字直接输出 扫描到运算符则与栈顶比较,若扫描到的运算符优先级低于或等于栈顶运算符的优先级...,则弹栈直到栈空或栈顶运算符优先级低于扫描到的运算符,之后运算符入栈;否则直接入栈。...base_stack.New_link_stack() topost := To_postfix{} topost.data_stack = link return &topost } 后缀表达式的计算...计算方法 后缀表达式的计算比较简单,顺序扫描整个后缀表达式: 若遇到数字,直接入栈 若遇到运算符,弹栈两次取出两个数字,按运算符运算,将结果再次入栈 这样扫描完整个后缀表达式之后,栈中就应该只有一个数

    1.5K70

    Leetcode:用队列实现栈,用栈实现队列

    //下面的栈都是用C语言写的,为使用STL // 链式结构:表示队列 typedef int QDataType; typedef struct QListNode { struct QListNode...* int param_3 = myStackTop(obj); * bool param_4 = myStackEmpty(obj); * myStackFree(obj); */ 用栈实现队列...思路: 首先创建两个栈,一个栈用来入队列,一个栈用来出队列,出队列时,如果出队列的栈为空,则将入队列的栈中的元素弹出到出队列的栈再出队列,否则,直接出栈。...//栈为用 C语言所写 //栈只能先进后出 //每个元素最后进出的相对顺序不唯一,可以边进边出 typedef int STDataType; typedef struct Stack { int...* a; //存储栈内元素的数组 int top; // 标识栈顶位置的,代表栈顶元素的下一个位置(也可以代表是栈顶元素,但栈为空时top==-1) int capacity; }ST; void

    16610

    栈的应用——表达式求值

    概要 表达式求值问题可以说是一个经典问题。具体思路就是首先把输入的中缀表达式转换为后缀表达式,然后再根据后缀表达式进行计算求值。...---- 中缀表达式转换为后缀表达式 首先我们设定运算符在进栈前与进栈后的优先级: ? 首先在栈把“#”进行压栈,并在中缀表达式追加“#”。“#”作为结束标志。...对中缀表达式进行遍历,遇到数字进行输出到后缀表达式中 如果遇到运算符,把栈顶的元素(前者)的栈内优先级与即将入栈元素(后者)的栈外优先级进行比较,如前者小,则运算符入栈,否则,则把栈顶元素(前者)出栈并输出到后缀表达式中...---- 后缀表达式求值 对后缀表达式进行遍历,如果是数字就入栈,如果是运算符,就连续出栈两次的结果进行保存,之后进行相应运算,把运算结果入栈,直至遍历结束,结果为栈顶元素。...); return after; } }; //这是后缀表达式计算类 class Sum{ private: int* sum

    64710

    用栈实现队列

    文章目录 题目介绍 思路分析 代码实现 C语言版本 C++版本 上一篇文章我们讲解了如何用队列实现栈,那这篇文章我们再来看一个兄弟题目——用栈实现队列 题目介绍 链接: link 仅使用两个栈实现先入先出队列...思路是这样的: 让我们用两个栈来实现 我们把其中一个栈命名为pushstack,只用来入数据(队尾入数据),另一个命名为popstack,只用来出数据(对头出数据) 比如我们现在入队列1 2...所以,总结一下: 队尾入数据的时候,永远把数据入到pushstack里面; 队头出数据的时候,要判断一下:如果popstack不为空,直接出栈popstack栈顶的元素即可,如果popstack为空...接着来看——pop:移除队头元素并返回 那这个其实就可以复用上面的peek函数,先调用一下peek接口,获取popstack栈顶的元素即队头元素作为返回值,当然返回之前再去pop掉popstack栈顶元素即可...代码实现 C语言版本 C语言实现的话,还是要自己造轮子,这里我就直接拷贝之前写过的栈: 接着是本题的代码实现: 然后 就过啦 C++版本 C++就可以直接用STL里面的stack,

    9210

    用栈实现队列

    一.栈的定义 ⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。...栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。...二.数据结构-栈的实现 需要Queue.h,Queue.c和test.c三个文件来实现 栈的实现可以通过数组或者链表的形式来实现,这里是用数组实现的 对栈的销毁,需要断言判空,同时也需要对数组是否为空进行判断...,队列具有先进先 出FIFO(First In First Out) 四.用栈实现队列 用栈实现队列,底层需要使用到对栈的实现 定义一个MyQueue的结构体,定义一个用于入栈的栈,一个用于出栈的栈...需要创建一个指针来接受内存申请,来实现对两个栈的初始化 入栈和出栈都需要对栈进行判空,先将数据导入pushST的栈中,再从中导入到popST的栈中进行出栈 返回队列的开头元素,也需要对栈判空 最后是对栈的判空操作和释放空间内存的操作

    8710
    领券