(文末提供原码)
声明运算符数组和数字数组
sign数组:指运算符数组。由于细节问题,'D'可以清除最后一位数字或符号,也作为运算符来看待。
minuSign数组:专门用来判断'-'是减号还是负号的数组。
isNumber数组:把小数点也作为数字。便于小数数字的连接和完整。
// 不包括'('是因为'('可以放在首位
var sign = ['+', '÷', '=', ')', '%', 'x', '-', 'D'];
// 如果是这些符号,就说明'-'是负号,如果是')'说明是减号
var minuSign = ['+', '÷', '(', 'x', '-'];
var isNumber = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'];
判断是否输入两个连续的运算符
function judgeNext (text, number) {
// 如果是负号,直接不管,没事
if (number === '-')
return;
// 如果text栈顶元素存在并且又判断出这个是运算符,说明输入了连续两个运算符
if (judgeSign(text[text.length - 1]) && judgeSign(number))
return true;
return false;
}
判断输入的字符里面是不是数字
function judgeNumber (number) {
for (let i = 0; i < isNumber.length; i++) {
if (isNumber[i] === number)
return true;
}
return false;
}
true代表是负号,false代表是减号
function minus (number) {
for (let i = 0; i < minuSign.length; i++) {
if (minuSign[i] === number)
return true;
}
return false;
}
中缀表达式转后缀表达式
function houZhui (right) {
// tempSign是临时存放运算符的栈
var tempSign = [];
// behindText存放的是后缀表达式
var behindText = [];
// 扫描中缀数组
for (let i = 0; i < right.length; i++) {
// 如果i是负号或者是')'
if (minus(right[i]) || right[i] === ')') {
if (tempSign.length === 0)
tempSign.push(right[i]);
else if (tempSign[tempSign.length - 1] === '(')
tempSign.push(right[i]);
else if (right[i] === '(')
tempSign.push(right[i]);
else if (right[i] === ')') {
// 一直弹出直到遇到左括号
while (tempSign[tempSign.length - 1] !== '(') {
let a = tempSign.pop();
// 然后把弹出的都传给后缀栈
behindText.push(a);
}
// 最后再弹出左括号
tempSign.pop();
}
else if (right[i] === '-' || right[i] === '+') {
while (tempSign[tempSign.length - 1] !== '(' && tempSign.length !== 0) {
let a = tempSign.pop();
// 传给后缀栈
behindText.push(a);
}
tempSign.push(right[i]);
}
else if (right[i] === 'x' || right[i] === '÷') {
while (tempSign[tempSign.length - 1] !== '(' && tempSign[tempSign.length - 1] !== '+' && tempSign[tempSign.length - 1] !== '-' && tempSign.length !== 0) {
let a = tempSign.pop();
behindText.push(a);
}
tempSign.push(right[i]);
}
}
// 如果不是负号和')'
else {
behindText.push(right[i])
}
}
while (tempSign.length !== 0) {
let a = tempSign.pop();
behindText.push(a);
}
return behindText;
}
计算后缀表达式
function caculate (right) {
var NUMBER = [];
for (let i = 0; i < right.length; i++) {
// 是运算符就计算
if (minus(right[i])) {
// 加法
if (right[i] === '+') {
if (NUMBER.length < 2)
return "错误";
else {
let a = NUMBER.pop();
let b = NUMBER.pop();
let c = a + b;
NUMBER.push(c);
}
}
// 减法
else if (right[i] === '-') {
if (NUMBER.length < 2)
return "错误";
else {
let a = NUMBER.pop();