스택(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개
저렇게 만들어 사용할 생각을 왜 못했을런지 ㅎㅎㅎ
게시글 목록
| 번호 | 제목 |
|---|---|
| 16429 |
기타
html 색상표
1
|
| 16424 | |
| 16423 |
node.js
NODE_JS + Nunjucks 설정
|
| 16412 |
PHP
한글 초성 추출하기
10
|
| 16408 | |
| 16407 |
JavaScript
input text 에 여러 이벤트 걸기 두기.
1
|
| 16401 | |
| 16395 |
JavaScript
Javascript를 최적화하는 13가지 팁
4
|
| 16394 |
JavaScript
URL이 올바른지 체크
2
|
| 16391 |
JavaScript
IE, Edge 브라우저에서는 해당 사이트가 접속이 안되게 하는 코드
2
|
| 16390 |
JavaScript
구글 맵 독도 표기 되도록.
|
| 16389 | |
| 16387 | |
| 16386 |
JavaScript
js playground
|
| 16382 |
JavaScript
javascript에서 php를 호출하여 내용 변경하기
|
| 16381 | |
| 16377 | |
| 16374 | |
| 16372 | |
| 16356 |
기타
기시판 질문입니다.
6
|
| 16355 |
정규표현식
정규식 테스트 연습 편하게
2
|
| 16354 |
정규표현식
제목에 특수문자 정리하는 정규식
2
|
| 16353 | |
| 16347 | |
| 16346 | |
| 16339 | |
| 16338 |
jQuery
체크박스 시프트(shift) 멀티선택
|
| 16332 |
node.js
Node.js MongoDB Drop
1
|
| 16331 |
node.js
여러 데이터 삭제
1
|
| 16330 |
node.js
Node.js MongoDB 삭제
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기