您的位置:首页 > Web前端 > JavaScript

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

2016-04-11 17:27 781 查看
中缀表达式:就是我通常用的算术或逻辑公式;

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

如,(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)、如果栈中剩有运算符,则依序出栈

例子:

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];
}


后缀表达式运算
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: