스택(stack)을 이용한 사칙연산(+ - * /) 계산기
<script>
// 연산자의 연산 우선순위
function getOpPrec(op)
{
switch (op)
{
case '*':
case '/':
return 5;
case '+':
case '-':
return 3;
case '(':
return 1;
}
return -1;
}
// 연산자의 우선순위 비교
function whoPrecOp(op1, op2)
{
return getOpPrec(op1) >= getOpPrec(op2); // op1의 연산순위가 높거나 같다면 참
}
function postfixNotation(exp)
{
var stack = [], convExp = [], tok, popOp;
exp = exp.replace(/\s/g, '').match(/[\d\.]+|[^\d\.]/g).reverse(); // 공백제거 및 배열로 분리
while (tok = exp.pop()) {
// 숫자가 아니라면(연산자라면)
if (isNaN(tok)) {
switch (tok)
{
case '(':
stack.push(tok);
break;
case ')':
while (1) {
popOp = stack.pop();
if ( popOp == '(' )
break;
convExp.push(popOp);
}
break;
case '+': case '-':
case '*': case '/':
while (stack.length && whoPrecOp(stack[stack.length-1], tok))
convExp.push(stack.pop());
stack.push(tok);
break;
}
} else // 숫자라면(피연산자라면)
convExp.push(tok);
}
while (stack.length)
convExp.push(stack.pop());
return convExp;
}
function evalPostfixNotation(exp)
{
var i, tok, n1, n2, stack = [];
for (i in exp) {
tok = exp[i];
// 연산자라면
if (isNaN(tok)) {
n2 = Number(stack.pop());
n1 = Number(stack.pop());
switch (tok)
{
case '*':
stack.push(n1 * n2);
break;
case '/':
stack.push(n1 / n2);
break;
case '+':
stack.push(n1 + n2);
break;
case '-':
stack.push(n1 - n2);
break;
}
} else // 숫자라면
stack.push(tok);
}
return stack.pop();
}
document.write( evalPostfixNotation(postfixNotation( '((3.5 - 2) + 3.4) * (14 - 10)' )));
</script>
댓글 4개
저렇게 만들어 사용할 생각을 왜 못했을런지 ㅎㅎㅎ
게시판 목록
개발자팁
질문은 QA에서 해주시기 바랍니다.
| 번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|---|
| 5066 | 기타 |
DogFoot개발
|
4년 전 | 1818 | |
| 5065 | PHP |
DogFoot개발
|
4년 전 | 1528 | |
| 5064 | PHP |
happyl
|
4년 전 | 1916 | |
| 5063 | node.js |
DogFoot개발
|
4년 전 | 1674 | |
| 5062 | node.js |
DogFoot개발
|
4년 전 | 1691 | |
| 5061 | node.js |
DogFoot개발
|
4년 전 | 1414 | |
| 5060 | node.js |
DogFoot개발
|
4년 전 | 1254 | |
| 5059 | node.js |
DogFoot개발
|
4년 전 | 1249 | |
| 5058 | 기타 |
DogFoot개발
|
4년 전 | 2697 | |
| 5057 | 웹서버 |
DogFoot개발
|
4년 전 | 2725 | |
| 5056 | MySQL | 4년 전 | 1502 | ||
| 5055 | 기타 | 4년 전 | 1434 | ||
| 5054 | OS | 4년 전 | 2069 | ||
| 5053 | 웹서버 | 4년 전 | 3630 | ||
| 5052 | OS | 4년 전 | 2423 | ||
| 5051 | PHP | 4년 전 | 2187 | ||
| 5050 | 웹서버 | 4년 전 | 1718 | ||
| 5049 | MySQL | 4년 전 | 1898 | ||
| 5048 | OS | 4년 전 | 2702 | ||
| 5047 | PHP | 4년 전 | 4372 | ||
| 5046 | MySQL | 4년 전 | 1819 | ||
| 5045 | MySQL | 4년 전 | 1943 | ||
| 5044 | MySQL | 4년 전 | 4132 | ||
| 5043 | MySQL | 4년 전 | 1890 | ||
| 5042 | 기타 |
|
4년 전 | 2635 | |
| 5041 | MySQL | 4년 전 | 1998 | ||
| 5040 | MySQL | 4년 전 | 1724 | ||
| 5039 | MySQL | 4년 전 | 1497 | ||
| 5038 | MySQL | 4년 전 | 1336 | ||
| 5037 | OS | 4년 전 | 4432 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기