后缀表达式求解

问题描述:

  后缀表达式也叫逆波兰式,中缀到后缀举例:

  ( 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. 从左向右扫描,遇到数字则入栈,遇到符号则出栈两个数字,计算后再入栈新数字,后缀表达式的特点就是方便计算,直接按操作符顺序和数字逆序计算即可。

边界case:

  1. 分母为0

  2. 数字范围超出上下限

知识点:

  1. 递归求解

  2. 树:后缀表达式可以画成树状,这样理解递归更方便

  3. 栈

难度:★★★

  

转载请注明引自:

  http://www.cnblogs.com/breakthings/p/4051711.html

时间: 2024-12-13 15:45:18

后缀表达式求解的相关文章

学习笔记:后缀表达式

一.中缀表达式转换为后缀表达式 ①扫描中缀表达式. ②遇到数字将其存入后缀表达式. ③遇到左括号将其入栈. ④遇到右括号,出栈运算符并存入后缀表达式,直至遇到左括号,将左括号出栈结束. ⑤遇到运算符,出栈运算符并存入后缀表达式,直到栈顶为优先级更小的运算符.左括号或空栈,将遇到的运算符入栈结束. ⑥扫描结束后将栈中的所有运算符出栈并存入后缀表达式. 二.后缀表达式求解 ①扫描后缀表达式. ②遇到数字时将其入栈. ③遇到运算符出栈两个数字进行运算,将结果入栈. ④扫描结束后栈顶的数字即为最终结果.

栈的典型实例问题——后缀表达式(逆波兰记号)的计算

//编译程序一般使用后缀表达式求解表达式的值(RPN或者逆波兰记号)//计算后缀表达式的过程为:扫描,如果该项是操作数,压栈:如果是操作符,则从栈中退出两个操作数(先退出的是右操作//数),进行运算,并将运算结果重新压入栈中,扫描完后栈顶存放的就是计算结果.//注意的地方:是否支持2位以上的操作数!//操作数之间也肯定是有分割符的: //比如:12 34 56 * + //如果是123456*+,不管是人还是计算机,都是没法做的: 1 #include<iostream> 2 #include

表达式求值(后缀表达式求值)

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

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

算数表达式的计算,也是很基础的一个问题.花了点时间写了下. 网上很多正确代码.但没有详细说明.虽然不复杂,但是还是写详细点.只有仔细思考过.问题才会在头脑中,觉得简单. 基本有2种方法. 1)中缀表达式转为后缀表达式,是最简洁有力的方法. 2)符合人的计算思路的逐步方法,不推荐使用,只适合锻炼下逻辑能力. 一.中缀表达式转为后缀表达式,是最简洁有力的方法. //更简洁通用的算法,就是把中缀表达式转换为后缀表达式.后缀表达式:不包含括号,运算符放在两个运算对象的后面. //一,无括号的n级符号算法

中缀表达式转后缀表达式---栈--二叉树---四则运算

我们平常书写的四则运算表达式属于中缀表达式,形式为"9+(3-1)*3+10/2",因为所有的运算符号都在两操作数之间,所以称为中缀表达式.我们使用中缀表达式来计算表达式的值,不过这种形式并不适合计算机求解.接下来,我们将中缀表达式转化为后缀表达式,所谓的后缀表达式就是操作符位于操作数后面的不包含括号的算数表达式,也叫做逆波兰表达式. 1)首先介绍一种人工的转化方法(http://www.cnblogs.com/MichaelYin/archive/2012/05/02/2479248

前缀表达式求解

问题描述: 前缀表达式也叫波兰表达式,是将操作符前置的一种写法. 中缀到前缀示例: ( 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. 从右向左扫描,遇到数字则入栈,遇

C++后缀表达式求值

#include <iostream> #include <stack> using namespace std; int cal(int a,int b,char c){ if(c=='+') return a+b; else if(c=='-') return a-b; else if(c=='*') return a*b; else if(c=='/') return a/b; else return 0; } int postcal(char* post){ stack &

深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

后缀表达式做计算器程序

概念: 后缀表达式是相较于中缀表达式而言的,像我们平时写的2+3*(4-(5+6))/7就是一个中缀表达式,那么如何将之变为后缀表达式呢?后缀表达式如何用来求解呢? 先来第一个问题(中缀->后缀): 变为后缀表达式方法(规则): 1.遇到操作数:直接添加到后缀表达式中 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后