我在网上看了很多的计算器都是那种没有实现优先级预算的,都是按照输入顺序来计算的,我不是很喜欢那种,然后我在网上查了查有没有别的办法,然后我知道逆波兰表达式,要实现优先级计算器,这个技能是要掌握的,有小伙伴感兴趣的话可以去网上查一查学一下,我在这就不多说,就简单的提一下
- 举一个栗子:
原表达式 :2*(4-1) // 这里暂时先不考虑中间的变化过程,待会再说
逆波兰表达式 :2 4 1 - *
首先我们要遍历你波兰表达式,遇到时数字的话我们先不管,当我们遇到第一个符号是 - 时让 - 号的前面两个数字进行相应的运算,然后就会得到一个新的值,再遍历遇到号,遇到号时让他的前面两位进行预算,是一开始的2 和刚才3在进行运算,这样就实现了优先级运算
1.我么首先要考虑的是怎么获得逆波兰表达式
这时我们要定义两个栈,一个用来存放数字,一个存放符号,那么我么就要对原来的基础的表达式进行拆分,肯定会有人想到调用一个现成方法然后直接拆分成字符,这样操作不是很好 例如: 12+13 会被拆分成 1,2,+,1,3 ,所以要换一种方法
2.其次就是要考虑符号的优先级
/*
将数字和符号分离开我的思路是,给符号两边加上一个任意的字符,然后变成一个新的字符串,然后通过刚才加的这个字符来截取,来把他们分开
*/
function nbl(text){
var operand = []; //用于存放操作数的栈
var operator = []; //用于存放操作符的栈
var textArr = text.split('');
var newTextArr = [];
for(var i = 0; i < textArr.length; i++){
if(text[i] == "+"||text[i]== "-"||text[i]== "*"||text[i]== "/"||text[i]== "("||text[i]== ")" && text[i] != ".") //这里可以优化一下,我这样写就是直观容易理解一点{
newTextArr.push("|",text[i],"|");
}
else{
newTextArr.push(textArr[i]);
}
}
var calTextArr = newTextArr.join('').split("|");
calTextArr.unshift("#")
for(var i = 0; i < calTextArr.length; i++){
//如果是数字则直接入栈
if(Number(calTextArr[i]) || Number(calTextArr[i]) == 0){
operand.push(calTextArr[i]);
}
//如果是操作符则再根据不同的情况进行操作
else {
switch(true){
//如果operator栈顶是“(”或者遍历到的操作符是“(”则直接入栈
case calTextArr[i] == "(" && operator.slice(-1)[0] == "(":
operator.push(calTextArr[i]);
break;
/*如果遍历到的操作符是“)”则把operator中的操作符依次弹出并压入
operand中直至operator栈顶操作符为“(”,然后将“(”也弹出,但不压入
operand栈中
*/
//(4+