逆波兰式与表达式求值

  • 何为波兰式?何为逆波兰式?
  • 如何与表达式求值联系起来?

波兰式、逆波兰式是数据结构和编译原理里面提到的知识点,我们平时的运算式都是这样的 2 + 3 * (5 - 1)-10(中缀表达式),这样表达式易于阅读和计算,但是对于计算机这样就有点懵逼了。

前缀表达式: 比如2 + 3 * (5 - 1)这个表达式的前缀表达式为+ 2 * 3 - 5 1来表示  波兰表达式

中缀序表达式:比如 2 + 3 * (5 - 1)-10

后缀表达式:比如2 + 3 * (5 - 1)用逆波兰式来表示则是:2 3 5 1 - * +  逆波兰表达式

 

求表达式值:

 

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

  

问题可以转换为遍历表达式用一个堆来存数字,当遇见操作符的时候,弹出两个数字执行相应的运算,再压入堆里面,最后返回出来的就是运算表达式的结果。

 

public class Test {

	public static void main(String[] args) throws IOException {
		String[] tokens = new String[] { "2", "1", "+", "3", "*" };
		System.out.println(evalRPN(tokens));
	}

	public static int evalRPN(String[] tokens) {
		int returnValue = 0;
		String operators = "+-*/";

		Stack<String> stack = new Stack<String>();

		for (String t : tokens) {
			if (!operators.contains(t)) { //push to stack if it is a number
				stack.push(t);
			} else {//pop numbers from stack if it is an operator
				int a = Integer.valueOf(stack.pop());
				int b = Integer.valueOf(stack.pop());
				switch (t) {
				case "+":
					stack.push(String.valueOf(a + b));
					break;
				case "-":
					stack.push(String.valueOf(b - a));
					break;
				case "*":
					stack.push(String.valueOf(a * b));
					break;
				case "/":
					stack.push(String.valueOf(b / a));
					break;
				}
			}
		}

		returnValue = Integer.valueOf(stack.pop());

		return returnValue;
	}
}

  

参考:http://www.programcreek.com/2012/12/leetcode-evaluate-reverse-polish-notation/

 

时间: 2024-10-01 05:48:21

逆波兰式与表达式求值的相关文章

表达式求值、表达式转二叉树

1.后序表达式求值: 后续表达式(逆波兰式)的特点:没有括号. 求值方法: 从前向后扫, 遇到操作数压栈: 遇到操作符,从栈中取出2个操作数运算,结果压栈. 最终栈中所剩的数为结果. 2.中序表达式求值 我们先来定义运算符的优先级: ( +,- *,/,% 从上到下依次升高 准备2个栈,一个专门存放运算符,另一个专门存放操作数. 1.遇到),那么退栈计算到(为止.结果压栈. 2.遇到运算数.那么压栈. 3.如果当前运算符优先级低于栈顶运算符.那么计算栈顶运算符并将结果压栈. 4.否则压栈. 计算

C#算术表达式求值

算术表达式求值是一个经典的问题,很多学习编程的人都对此不陌生.本来我并不想写一个算术表达式求值的算法.在网上我看到了一篇文章,名叫<快速精确的对数学表达式求值>( http://www-128.ibm.com/developerworks/cn/java/j-w3eva/ ).才有兴趣着一个玩玩.写来写去,觉得真得很经典.所以把我写的代码拿出来让大家看看吧.因为时间较紧.所以变量名没有做得很规范. w3eavl是用JAVA写得,我用C#把它重写了一下.基本上能用,只是三角函数/反三角函数/双曲

python 逆波兰式

逆波兰式,也叫后缀表达式 技巧:为简化代码,引入一个不存在的运算符#,优先级最低.置于堆栈底部   class Stack(object): '''堆栈''' def __init__(self): self._stack = [] def pop(self): return self._stack.pop() def push(self, x): self._stack.append(x)    一.表达式无括号 def solve(bds): '''不带括号,引入#运算符''' pro =

C语言实现逆波兰式实例_C 语言

复制代码 代码如下: #include<stdio.h>#include<string.h> typedef struct{char s[20][20];int top;}SQ; void copystr(char *a,char *b){    int i=0;    do    {        b[i]=a[i];        i++;    }    while(a[i]!='\0');    b[i]='\0';} void voidSQ(SQ *s){    s-&g

C语言数据结构:表达式求值代码问题

问题描述 C语言数据结构:表达式求值代码问题 要求允许小数,过滤空格,可以+ - * /和求指数 #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 //运算符集合数为8 char OPSET[OPSETSIZE] = { '+', '-', '*', '/', '(', ')', '#', '^' }; unsigned char Prior[8][8] = { /****

用C语言写解释器(二)——表达式求值

声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的学生(不要求有数据结构等其他知识),所以行文比较罗嗦,请勿见怪.本人水平有限,如有描述不恰当或错误之处请不吝赐教!特此声明. 内存管理 既然是表达式求值,自然需要在内存中保存计算结果以及中间值.在<用C语言写解释器(一)>中提过:变量要求是若类型,而 C 语言中的变量是强类型,为实现这个目标就需要

PHP使用逆波兰式计算工资的方法_php技巧

本文实例讲述了PHP使用逆波兰式计算工资的方法.分享给大家供大家参考.具体如下: 将一个普通的中序表达式转换为逆波兰表达式的一般算法是: 首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰 式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束.可指定其他字符,不一定非#不可.从中缀式的左端 开始取字符,逐序进行如下步骤: (1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈:若取出的是运算符,并

MYSQL表达式求值和MYSQL类型转换

    2.4 表达式求值和类型转换    MySQL允许编写包括常量.函数调用和表列引用的表达式.这些值可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符.表达式的项可用圆括号来分组.表达式在SELECT 语句的列选择列表和WHERE 子句中出现得最为频繁,如下所示:    所选择的每列给出了一个表达式,如WHERE 子句中所示的那样.表达式也出现在DELETE 和UPDATE语句的WHERE 子句中,以及出现在INSERT 语句的VALUES( ) 子句中.    在MySQL遇到一

后缀表达式求值及校验

摘要: 本程序是一个完整的后缀表达式计算,主要用栈的操作实现,本程序封装了CStack类实现栈的操作,本程序最大的特色在于运用动态监视表达式的算法对表达式进行数据校验,对一切合法的表达式进行计算,检验出所有任何非法表达式并提示. 关键字:后缀表达式,校验 题目:后缀表达式求值. 要求:输入后缀表达式,输入为整数和四则运算,输出计算结果. 例如: 输入:2 3 * 1 - 输出:5 分析:2*3-1=5 输入:1 2 + 5 4 * 3 - * 6 - 输出:45 分析:(1+2)*(5*4-3)