码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-04-11 18:50:47      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

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

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

如,(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);
中缀转后缀

 

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

标签:

原文地址:http://www.cnblogs.com/hujiapeng/p/5379238.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!