<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="main.css">
<script src="https://code.jquery.com/jquery-2.2.2.min.js" integrity="sha256-36cp2Co+/62rEAAYHLmRCPIych47CvdM+uTBJwSzWjI=" crossorigin="anonymous"></script>
<script src="common.js"></script>
<script src="infix.js"></script>
<script src="postfix.js"></script>
<script src="main.js"></script>
</head>
<body>
<h1>Infix to Postfix - Calculator</h1>
<div>
<div>
<input type="text" value="2 * 5 + 3 - 2 * (8 / (4 / 2)) + (3 * 3)" id="expression" />
<button type="button" id="btnCalc">Calculate</button>
</div>
<div class="hide">
Postfix expression: <span id="spanPostfix"></span>
</div>
<div>
<h3>Result:</h3>
<span id="spanResult"></span>
</div>
</div>
</body>
</html>
Infix to Postfix converter and Postfix calculator
See more about the project on my http://www.ivansivak.net/blog/simple-math-evaluator-infix-to-postfix-converter-and-calculator-reverse-polish-notation
var Common = (function(){
var tokenType = { operand: 1, operator: 2, leftPar: 3, rightPar: 4 },
operators = ['+', '-', '*', '/'];
var determineToken = function (char) {
if (~operators.indexOf(char)) return tokenType.operator;
switch (char) {
case '(':
return tokenType.leftPar;
case ')':
return tokenType.rightPar;
default:
return tokenType.operand;
}
};
var trimSpaces = function (str) {
return str.replace(/\s+/g, '');
};
var tokenize = function (str) {
var num = '',
res = [];
for (var i = 0; i < str.length; i++){
switch (Common.determineToken(str[i])) {
case Common.tokenType.operand:
num += $.trim(str[i]);
break;
case Common.tokenType.operator:
if ($.isNumeric(num)) res.push(parseFloat(num));
res.push(str[i]);
num = '';
break;
case Common.tokenType.leftPar:
case Common.tokenType.rightPar:
if ($.isNumeric(num)) res.push(parseFloat(num));
res.push(str[i]);
num = '';
break;
}
}
if (num != '') res.push(num);
return res;
}
return {
tokenType: tokenType,
determineToken: determineToken,
trimSpaces: trimSpaces,
tokenize: tokenize
}
})();
/**
* Examples:
* ============================================
* 2*3-4/5 = 23*45/-
* 5+3*2 = 5 3 2*+
* 10 + 3 * 5 / (16 - 4) = 10 3 5 * 16 4 - / +
* 2 * 5 + 3 - 2 * (8 / (4 / 2)) + (3 * 3) = 2 5 * 3 + 2 8 4 2 / / * - 3 3 * +
*/
var Infix = (function () {
var postfix,
stack;
var precedence = function (operator) {
switch (operator) {
case '*':
case '/':
return 3;
case '+':
case '-':
return 2;
case '(':
return 1;
}
};
var processOperand = function (char) {
postfix += char + ' ';
};
var processOperator = function (char) {
while (stack.length > 0 &&
(precedence(stack[stack.length - 1]) >= precedence(char))) {
postfix += stack.pop() + ' ';
}
stack.push(char);
};
var processLeftPar = function (char) {
stack.push(char);
};
var processRightPar = function (char) {
var j = stack.length - 1,
ce;
while (true) {
ce = stack.pop();
if (ce == '(') break;
postfix += ce + ' ';
}
};
var processToken = function (char) {
var type = Common.determineToken(char);
switch (type) {
case Common.tokenType.operand:
processOperand(char);
break;
case Common.tokenType.operator:
processOperator(char);
break;
case Common.tokenType.leftPar:
processLeftPar(char);
break;
case Common.tokenType.rightPar:
processRightPar(char);
break;
}
};
var start = function (infix) {
var tokens = Common.tokenize(infix);
for (var i = 0; i < tokens.length; i++) {
processToken(tokens[i]);
}
return postfix;
};
var toPostfix = function (infix) {
postfix = '';
stack = [];
stack.push('(');
return start(infix + ')');
};
return {
toPostfix: toPostfix
}
})();
//http://www.ivansivak.net/blog/simple-math-evaluator-infix-to-postfix-converter-and-calculator-reverse-polish-notation
$(document).ready(function () {
$('#btnCalc').click(function () {
var infix = $('#expression').val(),
postfix = Infix.toPostfix(infix);
$('#spanPostfix').text(postfix).parent().fadeIn();
$('#spanResult').text(Postfix.calc(postfix));
});
});
#spanResult{
font-size: 16px;
font-weight: bold;
color: rgb(teal);
}
.hide{
display: none;
}
input[type="text"]{
width: 250px;
}
var Postfix = (function () {
var stack = [];
var processOperand = function (char) {
stack.push(parseFloat(char));
};
var processOperator = function (char) {
var right = (stack.pop()),
left = (stack.pop());
switch (char) {
case '+':
stack.push(left + right);
break;
case '-':
stack.push(left - right);
break;
case '*':
stack.push(left * right);
break;
case '/':
stack.push(left / right);
break;
}
};
var processToken = function (char) {
var type = Common.determineToken(char);
switch (type) {
case Common.tokenType.operand:
processOperand(char);
break;
case Common.tokenType.operator:
processOperator(char);
break;
}
};
var calc = function (postfix) {
var tokens;
stack = [];
tokens = postfix.split(' ');
tokens.splice(tokens.length - 1, 1);
for (var i = 0; i < tokens.length; i++) {
processToken(tokens[i]);
}
return stack.pop();
};
return {
calc: calc
}
})();