
通过JavaScript实现带括号的计算器功能
实现一个能够处理括号的JavaScript计算器,核心在于解析输入、处理运算符优先级、确保括号匹配、实现正确的计算逻辑。在这篇文章中,我们将详细讲解如何编写一个能够处理括号的JavaScript计算器。
一、解析输入
首先,计算器需要解析用户的输入,识别数字、运算符和括号。通过创建一个解析器函数,可以将输入的字符串分割成易于处理的单元。
function tokenize(input) {
const tokens = [];
let numberBuffer = [];
for (let char of input) {
if (/d/.test(char)) {
numberBuffer.push(char);
} else {
if (numberBuffer.length) {
tokens.push(numberBuffer.join(''));
numberBuffer = [];
}
if (char !== ' ') {
tokens.push(char);
}
}
}
if (numberBuffer.length) {
tokens.push(numberBuffer.join(''));
}
return tokens;
}
二、运算符优先级和括号匹配
计算器需要处理运算符优先级和括号匹配。可以使用Shunting-yard算法来实现这一功能,该算法可以将中缀表达式转换为后缀表达式(逆波兰表示法),从而简化计算过程。
function shuntingYard(tokens) {
const outputQueue = [];
const operatorStack = [];
const precedence = {
'+': 1,
'-': 1,
'*': 2,
'/': 2
};
const associativity = {
'+': 'Left',
'-': 'Left',
'*': 'Left',
'/': 'Left'
};
for (let token of tokens) {
if (/d/.test(token)) {
outputQueue.push(token);
} else if (token in precedence) {
while (operatorStack.length &&
precedence[operatorStack[operatorStack.length - 1]] > precedence[token] ||
(precedence[operatorStack[operatorStack.length - 1]] === precedence[token] &&
associativity[token] === 'Left')) {
outputQueue.push(operatorStack.pop());
}
operatorStack.push(token);
} else if (token === '(') {
operatorStack.push(token);
} else if (token === ')') {
while (operatorStack[operatorStack.length - 1] !== '(') {
outputQueue.push(operatorStack.pop());
}
operatorStack.pop();
}
}
while (operatorStack.length) {
outputQueue.push(operatorStack.pop());
}
return outputQueue;
}
三、计算后缀表达式
将后缀表达式转化为最终的计算结果。我们可以使用一个栈来实现这一功能。
function evaluateRPN(tokens) {
const stack = [];
for (let token of tokens) {
if (/d/.test(token)) {
stack.push(parseFloat(token));
} else {
const b = stack.pop();
const a = stack.pop();
switch (token) {
case '+':
stack.push(a + b);
break;
case '-':
stack.push(a - b);
break;
case '*':
stack.push(a * b);
break;
case '/':
stack.push(a / b);
break;
}
}
}
return stack.pop();
}
四、整合功能
将上述各部分整合在一起,形成完整的计算器功能。
function calculate(input) {
const tokens = tokenize(input);
const rpn = shuntingYard(tokens);
return evaluateRPN(rpn);
}
// 示例使用
const expression = "3 + 4 * (2 - 1)";
console.log(calculate(expression)); // 输出结果:7
五、用户界面和交互
为了让用户能够方便地输入表达式和查看结果,我们还需要创建一个简单的用户界面。这里将使用HTML和JavaScript来实现。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS Calculator</title>
<style>
#calculator {
width: 200px;
margin: 100px auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 5px;
}
#display {
width: 100%;
padding: 10px;
margin-bottom: 10px;
text-align: right;
border: 1px solid #ccc;
border-radius: 3px;
}
.button {
width: 45px;
height: 45px;
margin: 2px;
font-size: 18px;
border: none;
border-radius: 3px;
cursor: pointer;
}
</style>
</head>
<body>
<div id="calculator">
<div id="display"></div>
<button class="button" onclick="appendToDisplay('1')">1</button>
<button class="button" onclick="appendToDisplay('2')">2</button>
<button class="button" onclick="appendToDisplay('3')">3</button>
<button class="button" onclick="appendToDisplay('+')">+</button>
<button class="button" onclick="appendToDisplay('4')">4</button>
<button class="button" onclick="appendToDisplay('5')">5</button>
<button class="button" onclick="appendToDisplay('6')">6</button>
<button class="button" onclick="appendToDisplay('-')">-</button>
<button class="button" onclick="appendToDisplay('7')">7</button>
<button class="button" onclick="appendToDisplay('8')">8</button>
<button class="button" onclick="appendToDisplay('9')">9</button>
<button class="button" onclick="appendToDisplay('*')">*</button>
<button class="button" onclick="appendToDisplay('(')">(</button>
<button class="button" onclick="appendToDisplay('0')">0</button>
<button class="button" onclick="appendToDisplay(')')">)</button>
<button class="button" onclick="appendToDisplay('/')">/</button>
<button class="button" onclick="clearDisplay()">C</button>
<button class="button" onclick="calculateResult()">=</button>
</div>
<script>
const display = document.getElementById('display');
function appendToDisplay(value) {
display.textContent += value;
}
function clearDisplay() {
display.textContent = '';
}
function calculateResult() {
try {
const result = calculate(display.textContent);
display.textContent = result;
} catch (e) {
display.textContent = 'Error';
}
}
</script>
</body>
</html>
六、总结
通过解析输入、处理运算符优先级、实现括号匹配、计算后缀表达式,我们成功实现了一个带括号功能的JavaScript计算器。本文的代码提供了一个完整且可以运行的示例,能够帮助你理解如何实现复杂的计算逻辑。希望这篇文章能对你有所帮助,让你在JavaScript编程中更加得心应手。
相关问答FAQs:
1. 在JavaScript计算器中,如何输入带有括号的表达式?
- 括号在数学表达式中非常重要,用于确定运算的优先级和顺序。在JavaScript计算器中,您可以使用圆括号来指定需要首先进行计算的部分。
- 例如,如果您想计算表达式 (2 + 3) * 4,您可以在输入框中直接输入这个表达式,然后按下计算按钮。计算器会按照括号内的优先级先计算加法,然后再乘以4。
2. 如何输入多层嵌套的括号表达式?
- 当您需要处理多层嵌套的括号表达式时,可以使用相同的方法。只需确保括号的层次结构正确,并按照从内到外的顺序输入表达式。
- 例如,如果您要计算表达式 ((2 + 3) * (4 – 1)) / 2,您可以在输入框中按照括号的层次结构输入这个表达式。计算器会按照正确的顺序计算括号内的表达式,并给出结果。
3. 是否可以在JavaScript计算器中使用其他类型的括号?
- 在JavaScript中,圆括号(())是用于数学运算的常见括号符号。但是,如果您希望在计算器中使用其他类型的括号,例如方括号([])或花括号({}),可能需要使用特定的计算器或自定义代码来实现。
- 如果您正在使用通用的JavaScript计算器,建议尽量使用圆括号,以确保您的表达式在计算时按照正确的优先级进行解析和计算。如果您需要使用其他类型的括号,请确保计算器支持该功能,并按照其规定的方式输入表达式。
文章包含AI辅助创作,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/3692190