JavaScript四则运算:加减乘除

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JavaScript四则运算:加减乘除
这⼏天也在学习 javascript,前⼏⽇看了⼀篇关于解析四则运算表达式和算法的⽂章,觉得四则运算很常⽤,打算编写代码看看最终结果。

⾸先我看代码了解了两个关于算术或逻辑公式的表⽰法:中缀表⽰法以及逆波兰表⽰法,也学习了四则运算的实际转换过程(此定义在原⽂有详细解释)。

原⽂:
分析了作者写的代码后,在此基础上加了些代码。

在这个过程中巩固学习了关于堆栈的知识以及栈(后进先出)和队列(先进先出)⽅法。

以下代码就是⾃认为⽐较完整的代码:
⾸先判断加减乘除的优先级,* 和 / 的优先级⾼于 + 和 - :
1function isOperator(value) {
2var operatorString = "+-*/()";
3return operatorString.indexOf(value) > -1
4 }
5
6function getPrioraty(value) {
7switch (value) {
8case '+':
9case '-':
10return 1;
11case '*':
12case '/':
13return 2;
14default:
15return 0;
16 }
17 }
18
19//判断加减乘除的优先级
20function prioraty(o1, o2) {
21return getPrioraty(o1) <= getPrioraty(o2);
22 }
定义输⼊、输出栈以及输出队列,循环逐个添加到输⼊栈的末尾,之后处理符号和数字,当找到 "(" 和 ")" 时特殊处理:
1function dal2Rpn(exp) {
2//输⼊栈
3var inputStack = [];
4//输出栈
5var outputStack = [];
6//输出队列
7var outputQueue = [];
8
9for (var i = 0, len = exp.length; i < len; i++) {
10var cur = exp[i];
11if (cur != ' ') {
12 inputStack.push(cur); //+-*/() 数字,逐个添加到末尾
13 }
14 }
15
16//处理字符和数字
17while (inputStack.length > 0) {
18
19//shift 顶部取得⼀项后移除,unshift 顶部推⼊
20 cur = inputStack.shift();
21
22//如果是符号 --> + - * / ( )
23if (isOperator(cur)) {
24if (cur == '(') {
25//push 从尾部推⼊⼀项
26 outputStack.push(cur);
27 } else if (cur == ')') {
28//pop 从尾部取得⼀项,之后移出
29var po = outputStack.pop();
30while (po != '(' && outputStack.length > 0) {
31 outputQueue.push(po);
32 po = outputStack.pop();
33 }
34if (po != '(') {
35throw "错误:没有匹配";
36 }
37 } else { //符号时,处理 + - * /
38while (prioraty(cur, outputStack[outputStack.length - 1])
39 && outputStack.length > 0) {
40 outputQueue.push(outputStack.pop());
41 }
42 outputStack.push(cur);
43 }
44 } else { //是数字的时候,推⼊数字
45 outputQueue.push(new Number(cur));
46 }
47 }
48
49if (outputStack.length > 0) {
50if (outputStack[outputStack.length - 1] == ')'
51 || outputStack[outputStack.length - 1] == '(') {
52throw "错误:没有匹配";
53 }
54while (outputStack.length > 0) {
55 outputQueue.push(outputStack.pop());
56 }
57 }
58return evalRpn(outputQueue);
59 }
定义 evalRpn() 函数,输出堆栈的长度不⼩于2的时候,进⾏计算:
1function evalRpn(queue) {
2var outputStack = [];
3while (queue.length > 0) {
4var cur = queue.shift();
5
6if (!isOperator(cur)) {
7 outputStack.push(cur);
8 } else {
9//如果输出堆栈长度⼩于 2
10if (outputStack.length < 2) {
11throw "⽆效堆栈长度";
12 }
13var second = outputStack.pop();
14var first = outputStack.pop();
15
16 outputStack.push(getResult(first, second, cur));
17 }
18 }
19
20if (outputStack.length != 1) {
21throw "不正确的运算";
22 } else {
23return outputStack[0];
24 }
25 }
进⾏加减乘除计算之后,对其值进⾏操作,当浮点数的⼩数位超过两位时,只保留两位⼩数点: 1function getResult(first, second, operator){
2var result = 0;
3switch (operator) {
4case '+':
5 result = first + second;
6break;
7case '-':
8 result = first - second;
9break;
10case '*':
11 result = first * second;
12break;
13case '/':
14 result = first / second;
15break;
16default:
17return 0;
18 }
19
20//浮点数的⼩数位超过两位时,只保留两位⼩数点
21function formatFloat(f, digit) {
22//pow(10,n) 为 10 的 n 次⽅
23var m = Math.pow(10, digit);
24return parseInt(f * m, 10) / m;
25 }
26return (formatFloat(result, 2));
27 }
输⼊要计算的表达式,计算结果 ( 结果得到 -0.6 ):
1 var result=dal2Rpn('( 1 +
2 ) * ((
3 -
4 ) / 5)');
2 console.log(result); //输出结果。

相关文档
最新文档