스택(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에서 해주시기 바랍니다.
| 번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|---|
| 5366 | 기타 |
nekoieye
|
1년 전 | 1119 | |
| 5365 | PHP | 1년 전 | 774 | ||
| 5364 | JavaScript | 1년 전 | 526 | ||
| 5363 | JavaScript | 1년 전 | 993 | ||
| 5362 | 1년 전 | 1233 | |||
| 5361 | JavaScript | 1년 전 | 1241 | ||
| 5360 |
그누보드이해하기
|
1년 전 | 776 | ||
| 5359 | 1년 전 | 1091 | |||
| 5358 | 1년 전 | 1095 | |||
| 5357 | 1년 전 | 808 | |||
| 5356 | 1년 전 | 367 | |||
| 5355 |
|
1년 전 | 586 | ||
| 5354 | 1년 전 | 1062 | |||
| 5353 |
|
1년 전 | 703 | ||
| 5352 |
|
1년 전 | 640 | ||
| 5351 | PHP | 1년 전 | 809 | ||
| 5350 | PHP | 1년 전 | 574 | ||
| 5349 | OS | 1년 전 | 647 | ||
| 5348 | 기타 | 1년 전 | 450 | ||
| 5347 | 기타 | 1년 전 | 633 | ||
| 5346 | 기타 | 1년 전 | 505 | ||
| 5345 | 기타 | 1년 전 | 400 | ||
| 5344 | JavaScript |
|
1년 전 | 430 | |
| 5343 | PHP |
|
1년 전 | 501 | |
| 5342 | jQuery | 1년 전 | 575 | ||
| 5341 | PHP |
|
1년 전 | 880 | |
| 5340 | Mobile |
슈퍼스타맨
|
1년 전 | 560 | |
| 5339 | 기타 |
|
1년 전 | 560 | |
| 5338 |
멀티트리플
|
2년 전 | 1297 | ||
| 5337 | 기타 |
슈퍼스타맨
|
2년 전 | 1792 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기