中缀表达式:就是我通常用的算术或逻辑公式;

后缀表达式:不包含括号,运算符放在两个运算对象后面,所有的计算按运算符出现的顺序,严格从左向右进行,不用考虑运算符优先级;

如,(2+1)*3 转换后,2 1 + 3 *

1、人工实现转换

如中缀表达式:a+b*c-(d+e)

  (1)、按照运算符优先级对所有运算单位加括号,式子变成:((a+(b*c))-(d+e))

  (2)、把运算符号移动到对应括号后面,变成:((a(bc)*)+(de)+)-

  (3)、把括号去掉就变成后缀表达式了:abc*+de+-

2、中缀转后缀算法:

如中缀表达式:(1+2)*((8-2)/(7-4))

  (1)、设立一个空栈,用于存放运算符

  (2)、从左向右扫描,如果是操作数,直接输出;如果遇到左括号直接进栈,如果遇到右括号,则一直退栈,直到遇到左括号;如果是运算符,要和栈顶运算符比较(此处运算符比较就是+、-、*、/四则运算比较),比栈顶级别高,进栈,否则输出栈顶运算符(比较一次),然后运算符进栈

  (3)、如果栈中剩有运算符,则依序出栈

例子:

//        var expression = '(1+2)*((8-2)/(7-4))';
var expression ='3+(2-5)*6/3'
var obj = {'+': 0, '-': 0, '*': 1, '/': 1, '(': -1};
var arr = [];
var str = '';
for (var i = 0; i < expression.length; i++) {
var curChar = expression[i];
if (curChar == ' ') {
continue;
}
var num = /^\d$/.test(curChar);
if (num) {
str = str + curChar + ' ';
continue;
} else if (curChar == '(') {
arr.push(curChar);
} else if (curChar == ')') {
var len = arr.length;
for (var j = 0; j < len; j++) {
var pop = arr.pop();
if (pop != '(') {
str = str + pop + ' ';
} else {
break;
}
}
} else {
if (arr.length > 0) {
var top = arr[arr.length - 1];
if (obj[curChar] > obj[top]) {
arr.push(curChar);
} else {
var pop = arr.pop();
arr.push(curChar);
str = str + pop + ' ';
}
} else {
arr.push(curChar);
}
}
}
for(var i=arr.length-1;i>=0;i--){
str = str + arr[i] + ' ';
}
console.log(str);

中缀转后缀

3、后缀表达式求职算法

  (1)、设定一个空栈

  (2)、从左向右扫描后缀表达式

  (3)、如果是操作数入栈,如果是运算符,从栈中取出两个数,进行运算(如果使用js数组,pop方法弹栈,那么将先出的放在运算符右边,后出的在左边),再将结果入栈

直到后缀表达式扫描完毕,栈中仅有一个元素,即为运算结果

依然使用上面的表达式,console.log(calculatePostfix(str));

function calculatePostfix(postfixExp) {
var arr = [];
for (var i = 0; i < postfixExp.length; i++) {
var curVal = postfixExp[i];
if(curVal==' '){
continue;
}
switch (curVal) {
case '+':
{
var pop1 = arr.pop();
var pop2 = arr.pop();
var res=parseFloat(pop2)+parseFloat(pop1);
arr.push(res);
break;
}
case '-':
{
var pop1 = arr.pop();
var pop2 = arr.pop();
var res=parseFloat(pop2)-parseFloat(pop1);
arr.push(res);
break;
}
case '*':
{
var pop1 = arr.pop();
var pop2 = arr.pop();
var res=parseFloat(pop2)*parseFloat(pop1);
arr.push(res);
break;
}
case '/':
{
var pop1 = arr.pop();
var pop2 = arr.pop();
var res=parseFloat(pop2)/parseFloat(pop1);
arr.push(res);
break;
}
default :
{
arr.push(curVal);
break;
}
}
}
return arr[0];
}

后缀表达式运算

中缀表达式转后缀表达式(用于求字符串表达式值)(js栈和队列的实现是通过数组的push和unshift方法插值,pop方法取值)的更多相关文章

  1. 【java】中缀表达式转后缀表达式 java实现

    算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...

  2. [SAP ABAP开发技术总结]字符串表达式String Expressions

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作

    Visual Studio 2017中使用正则修改部分内容   最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...

  4. 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)

    定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...

  5. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  6. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  7. 中缀表达式转后缀表达式(Java代码实现)

    后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...

  8. C++之字符串表达式求值

    关于字符串表达式求值,应该是程序猿们机试或者面试时候常见问题之一,昨天参加国内某IT的机试,压轴便为此题,今天抽空对其进行了研究. 算术表达式中最常见的表示法形式有 中缀.前缀和 后缀表示法.中缀表示 ...

  9. RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript

    1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...

随机推荐

  1. RabbitMQ官方中文入门教程(PHP版) 第一部分:Hello World

    RabbitMQ是一个消息代理.它的核心原理非常简单:接收和发送消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,RabbitMQ是一个邮箱.邮局.邮 ...

  2. Oracle SQL Developer 添加SQLServer 和Sybase 连接

    来源于: http://blog.csdn.net/kk185800961/article/details/8602306 1. 开始只有Oracle 和access 连接 2. 打开Oracle S ...

  3. Ubuntu 14.04 安装最新稳定版Nginx 1.6.0

    如果已经安装,请先卸载sudo apt-get remove nginx最新的稳定版Nginx 1.6.0在ubuntuupdates ppa库中提供,网址http://www.ubuntuupdat ...

  4. (转)ElasticSearch学习

    ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引 ...

  5. iOS开发--换肤简单实现以及工具类的抽取

    一.根据美工提供的图片,可以有两种换肤的方案. <1>美工提供图片的类型一: <2>美工提供图片的类型二:这种分了文件夹文件名都一样的情况,拖入项目后最后用真实文件夹(蓝色文件 ...

  6. Dubbo系列_概述

    一.本文目的         学习使用Dubbo也有一段时间了,准备写一个系列文章介绍Dubbo的相关知识和使用,供自己以后回顾和他人学习.有兴趣的同学可以加入群:74085440一起探讨 二.书写计 ...

  7. AOP 学习笔记

    代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...

  8. java多线程synchronized底层实现

    一直想把这个特别重要的关键词的底层实现搞明白.(当然现在也没有完全明白,如果有错误以后修改这篇文章) 首先,这个关键词synchronize可以说是个语法糖,它的具体用法网上很多博客都讲的比较明了了. ...

  9. UIScrollView 实践经验(转)

    转载自:http://tech.glowing.com/cn/practice-in-uiscrollview/ UIScrollView(包括它的子类 UITableView 和 UICollect ...

  10. 用select实现监控终端输入

    首先,从man手册里找到对select函数的描述,如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptf ...