ํ์ํ๊ธฐ๋ฒ์ผ๋ก ๊ณ์ฐ๊ธฐ ๋ง๋ค๊ธฐ
๊ณ์ฐ๊ธฐ ๊ด๋ จ ์ธ์ฃผ๊ฐ ๋ค์ด์์ ํด๋ณด๋ ์ค, ์์ ์ ๋ฐฐ์ ๋ ํ์ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด์ผํ๋ค. ๊ทธ๋ฐ๋ฐ ๊ธฐ์ต์ด ์๋์ ๊ฒ์ ์์ด ํผ์ ๊ตฌํํ๋ ค๋ค ๋ณด๋ ๋๋ฌด ์ด๋ ค์ ๋ค... ๊ฒ์ํด๋ณด๋๊น stack์ ์ด์ฉํด์ ํ์ํ๊ธฐ๋ฒ์ ๋ง๋๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ๋์์์ด์ ๊น๋จน์ง ์๊ธฐ ์ํด ๊ธฐ๋กํ๋ค.
ํ์ ํ๊ธฐ๋ฒ
์์ ํธ๋ฆฌ
ํ์ ํ๊ธฐ๋ฒ์ด๋ ๊ณ์ฐ์์์ ๊ณ์ฐ์ ์ํด ์ฌ์ฉํ๋ ํ๊ธฐ๋ฒ์ด๋ค. ์์ ์ ํจ๊ป ์ดํด๋ณด์.
- ์์ :
9x3+1-3%3
์์์ด ์ฃผ์ด์ก์ ๋ ๋น์ฐ์ฐ์์ ์ฐ์ฐ์๋ก ๋๋ ํ, ๊ฐ ํญ๋ชฉ์ ํ๋์ ๋ ธ๋๋ผ๊ณ ์๊ฐํ๋ฉด ํธ๋ฆฌ ํํ๋ก ๋ง๋ค ์ ์๋ค.
์ด๋ฌํ ํธ๋ฆฌ๋ ์์์ ํธ๋ฆฌ๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ก ๋ง๋ ๊ฒ์ด๋ ์์ํธ๋ฆฌ, ์ฆ Expression Tree๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
ํธ๋ฆฌ ์ํ์ ํ๊ธฐ๋ฒ
ํธ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฐฉ์์๋ prefix(์ ์), infix(์ค์), postfix(ํ์)๊ฐ ์๋๋ฐ,
[ํธ๋ฆฌ ๋งํฌ] ์ฐธ์กฐ
์์์ ๋์จ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์์์ ์ค์์ํ๋ก ์์ํธ๋ฆฌ๋ฅผ ์ํํ์ฌ ๋์จ ์ค์ํ๊ธฐ๋ฒ์ด๋ค.
์ด๋ฅผ ์ปดํจํฐ์์ ๊ณ์ฐํ๊ธฐ ์ข์ ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ค๋ฉด ํ์ ์ํ๋ฅผ ํตํด ํ์ํ๊ธฐ๋ฒ์ ๋ง๋ค์ด์ผํ๋ค.
ํ์์ํ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์งํ๋๋ฉฐ, ๊ฒฐ๊ณผ๋ก ๋์ค๋ ์์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์์ :
93x1+33%-
ํ์ ํ๊ธฐ์ ๋ง๋ค๊ธฐ
ํ์ํ๊ธฐ์์ ๋ง๋ค๊ณ ๊ณ์ฐํ๋ ๋ฒ์ ๋ฐฐ์ ๋ค. ๊ทธ๋ฐ๋ฐ ๊ผญ ํธ๋ฆฌ๋ก ๋ง๋ค์ด์ ํ์ํ๊ธฐ์์ ์์ฑํด์ผํ ๊น?
๋ณธ์ธ๋ ์ด๋ ๊ฒ ํ์ํ๊ธฐ์์ ๋ง๋ค๋ ค๋ค๊ฐ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์๋ ๊ฒ ๊ฐ์ ๊ฒ์์ ํด๋ณด์๋ค.
๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ stack์ ์ด์ฉํ๋ ๊ฒ์ด๋ค. ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋น์ฐ์ฐ์(์ซ์)๊ฐ ๋์ค๋ฉด stack์ ์ง์ด๋ฃ๋๋ค(push).
- ์ฐ์ฐ์๊ฐ ๋์ค๋ฉด
- operator stack์ ์ฐ์ฐ์๊ฐ ์์ผ๋ฉด ์ง์ด๋ฃ๋๋ค(push).
- operator stack์ ์๋ ์ฐ์ฐ์๊ฐ ํด๋น ์ฐ์ฐ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ฑฐ๋ ๊ฐ๋ค๋ฉด operator stack์ ์๋ ์ฐ์ฐ์๋ฅผ ๋นผ์(pop) stack์ ์ง์ด๋ฃ๊ณ (push), ํ์ฌ ์ฐ์ฐ์๋ฅผ operator stack์ ๋ฃ๋๋ค(push).
- operator stack์ ์๋ ์ฐ์ฐ์๊ฐ ํด๋น ์ฐ์ฐ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ๋ค๋ฉด operator stack์ ๋ฃ๋๋ค(push).
์์์ ์ธ๊ธํ ์ฐ์ฐ์์ ์ฐ์ ์์๋ +, - < x, % < (, )
์ด๋ค.
์์ ์์์ ๊ฐ์ง๊ณ ํ์ํ๊ธฐ์์ ๋ง๋ค์ด๋ณด์.
- ์์ :
9x3+1-3%3
์ฐ์ ์์๊ฐ ๋ ๋์ ์ฐ์ฐ์๊ฐ ์คํ์ ์์ผ๋ฉด ๋นผ๊ณ , ํด๋น ์ฐ์ฐ์๋ฅผ ์คํ์ ์ง์ด๋ฃ๋๋ค.
๊ฒฐ๊ณผ์ ์๋ ๊ฐ๋ค์ ์ฐจ๋ก๋ก ๋นผ๋ด๋ฉด ํ์ํ๊ธฐ์์ด๋ค.
ํ์ ํ๊ธฐ์ ๊ณ์ฐ
๊ทธ๋ ๋ค๋ฉด ์ฃผ์ด์ง ํ์ํ๊ธฐ๋ฒ ์์์ ๋ํด์๋ ์ด๋ป๊ฒ ๊ณ์ฐํ ์ ์์๊น? ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋น์ฐ์ฐ์(์ซ์)๊ฐ ๋์ค๋ฉด number stack์ ์ง์ด๋ฃ๋๋ค(push).
- [stack ๋งํฌ] ์ฐธ์กฐ
- ์ฐ์ฐ์๊ฐ ๋์ค๋ฉด
- number stack์์ 2๊ฐ์ ์ซ์๋ฅผ ๊บผ๋ธ๋ค(pop).
- 2๊ฐ์ ์ซ์๋ฅผ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ณ์ฐํ๋ค.
- ๊ฒฐ๊ณผ๋ก ๋์จ ์ซ์๋ฅผ ๋ค์ number stack์ ์ง์ด๋ฃ๋๋ค(push).
์์๋ก ์ฃผ์ด์ง ์์์ ํตํด ์์ธํ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ฐ์๊ฐ ๋์ค๋ฉด, ์ซ์ ์คํ์์ 2๊ฐ์ ์ซ์๋ฅผ ๊บผ๋ด์ ๊ณ์ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ซ์ ์คํ์ ๋ฃ๋๋ค.
์ด๋ฌํ ๊ณ์ฐ ๋ฐฉ์์ ๋ฐ๋ณตํ๋ค.
๊ฒฐ๊ณผ๋ 27์ด๋ค.
์ฐ๋ฆฌ์๊ฒ ์ต์ํ ์ค์ํ๊ธฐ๋ฒ์ผ๋ก ๋ ์์์ ์ง์ ํ์ด๋ณด๋ฉด
- ์์ :
(9x3)+1-(3%3)
=27+1-1
=27
์ ๋ต์ด๋ค.
๊ณ์ฐ๊ธฐ ๋ง๋ค๊ธฐ
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>๊ณ์ฐ๊ธฐ ๋ง๋ค๊ธฐ</title>
<link rel="stylesheet" href="hw04.css" />
<script type="text/javascript" src="hw04.js"></script>
</head>
<body>
<h3>๊ณ์ฐ๊ธฐ ๋ง๋ค๊ธฐ</h3>
<hr>
<table>
<tr>
<td colspan="4"><input type="text" id="lcd" value="0" size="50"></td>
</tr>
<tr>
<td><input type="button" value="BACK" onclick="backward()"></td>
<td><input type="button" value="CE" onclick="clearLcd()"></td>
<td><input type="button" value="C" onclick="clearLcd();"></td>
<td><input type="button" value="=" onclick="calculate()"></td>
</tr>
<tr>
<td><input type="button" onclick="addInput(7)" value=7></td>
<td><input type="button" onclick="addInput(8)" value=8></td>
<td><input type="button" onclick="addInput(9)" value=9></td>
<td><input type="button" onclick="addInput('+')" value='+'></td>
</tr>
<tr>
<td><input type="button" onclick="addInput(4)" value=4></td>
<td><input type="button" onclick="addInput(5)" value=5></td>
<td><input type="button" onclick="addInput(6)" value=6></td>
<td><input type="button" onclick="addInput('-')" value='-'></td>
</tr>
<tr>
<td><input type="button" onclick="addInput(1)" value=1></td>
<td><input type="button" onclick="addInput(2)" value=2></td>
<td><input type="button" onclick="addInput(3)" value=3></td>
<td><input type="button" onclick="addInput('x')" value='x'></td>
</tr>
<tr>
<td><input type="button" value='NONE'></td>
<td><input type="button" onclick="addInput(0)" value=0></td>
<td><input type="button" value='NONE'></td>
<td><input type="button" onclick="addInput('%')" value='%'></td>
</tr>
<table>
</body>
</html>
html ๊ตฌ์ฑ์ ์์ ๊ฐ๋ค.
- ๊ณ์ฐ ๊ฒฐ๊ณผ์ ๊ณผ์ ์ id๊ฐ lcd์ธ text input์ ๋ํ๋๋ค.
- ์ฐ์ฐ์๋ ๋น์ฐ์ฐ์ ๋ฒํผ์ ๋๋ฅด๋ฉด addInput ํจ์๊ฐ ํธ์ถ๋๋๋ก ํ์๋ค. addInput ํจ์๋ lcd์ ๋๋ฅธ ๋ฒํผ์ ๊ทธ๋๋ก ์ถ๋ ฅํด์ฃผ๋ ์ญํ ์ ํ๋ค.
- C๋ CE๋ฅผ ๋๋ฅด๋ฉด lcd๊ฐ 0์ผ๋ก ์ด๊ธฐํ ๋๋ค.
- Back ๋ฒํผ์ ๋๋ฅด๋ฉด lcd์ ์ถ๋ ฅ๋ ์์์์ ๋ง์ง๋ง ๊ธ์๊ฐ ์ง์์ง๋ค.
=
๋ฒํผ์ ๋๋ฅด๋ฉด lcd์ ์ถ๋ ฅ๋ ์์์ ๊ฒฐ๊ณผ๊ฐ ๊ณ์ฐ๋์ด lcd์ ์ถ๋ ฅ๋๋ค.
function addInput(b) {// ์ซ์๋ ๊ธฐํธ๊ฐ ๋๋ ค์ง๋ฉด ๊ทธ๋๋ก ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๋ ํจ์
var lcd = document.getElementById('lcd');
lcd.value = lcd.value=="0"?"":lcd.value; // ๊ฐ์ด 0์ด๋ฉด ์์ ๊ณ ์ซ์ ๋ฐ ๊ธฐํธ ์ถ๊ฐ
lcd.value += typeof(b)==Number?b.toString():b; // ์ซ์๋ฉด string์ผ๋ก ๋ณํ
}
function backward() { //back ๋ฒํผ์ ๋ํ ์ฒ๋ฆฌ ํจ์
var lcd = document.getElementById('lcd');
lcd.value = lcd.value.substring(0, lcd.value.length-1);
lcd.value = lcd.value==""?"0":lcd.value; // ๊ฐ์ด ์์ผ๋ฉด 0 ๋
ธ์ถ
}
function calculate() { // "="๊ฐ ๋๋ฌ์ง ๊ฒฝ์ฐ. ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ ์ถ๋ ฅ
var lcd = document.getElementById('lcd');
var arr = [];
var value = 0;
var stack = [];
for(var char of lcd.value){
// ๋ฐฐ์ด์ ์ซ์ / ๋ฌธ์ ๊ตฌ๋ถํด์ ๋ฃ๊ธฐ
// ํ์ ์ฐ์ฐ ์์๋ก ๋ฃ๊ธฐ
if(!isNaN(char)){ // ์ซ์์ด๋ฉด
value = 10*value+Number(char);
}else{ // ๋ฌธ์์ด๋ฉด
arr.push(value);
const tmp = stack.pop();
if(tmp==undefined){ // stack์ด ๋น์ด์์ผ๋ฉด
stack.push(char);
}else{
if(operPriority(tmp,char)){
// stack์ ์ฐ์ฐ์๊ฐ ๋ ์ฐ์ ์์๊ฐ ๋๊ฑฐ๋ ๊ฐ์ผ๋ฉด stack์์ ๋นผ๊ณ ๋ฃ๊ธฐ
arr.push(tmp); stack.push(char);
} else{ // ๋ฎ์ผ๋ฉด stack์ ์๊ธฐ
stack.push(tmp); stack.push(char);
}
}
value=0;
}
}
arr.push(value);
let pop_element = stack.pop(); // stack์ ์๋ ์ฐ์ฐ์ ๋ค ๋นผ๊ธฐ
while(pop_element!=undefined){
arr.push(pop_element);
pop_element = stack.pop();
}
// ๊ณ์ฐ
var value=[];
for(var char of arr){
if(!isNaN(char)){ // ์ซ์์ด๋ฉด
value.push(char);
} else{ // ๋ฌธ์์ด๋ฉด
const v1 = value.pop();
const v2 = value.pop();
switch(char){
case "+":
value.push(v2+v1);
break;
case "-":
value.push(v2-v1);
break;
case "x":
value.push(v2*v1);
break;
case "%":
if(v2==0)
alert("0์ผ๋ก ๋๋์ ์์ต๋๋ค.");
else
value.push(v2/v1);
break;
}
}
const tmp = value.pop();
value.push(tmp);
}
lcd.value=value.pop();
}
function operPriority(oper1, oper2){
// oper2์ ์ฐ์ ์์๊ฐ ๊ฐ๊ฑฐ๋ ํฌ๋ฉด true ๋ฐํ
switch(oper1){
case "+":
case "-":
if(oper2=="x" || oper2 =="%")
return false;
return true;
case "x":
case "%":
return true;
}
}
function clearLcd() { // "CE", "C"๊ฐ ๋๋ฌ์ง ๊ฒฝ์ฐ, lcd ํด๋ฆฌ์ด
var lcd = document.getElementById("lcd");
lcd.value = "0";
}
js ๊ตฌ์ฑ์ ์์ ๊ฐ๋ค.
- ์ฐ์ฐ์์ ์ฐ์ ์์๋ฅผ ๊ณ์ฐํด์ฃผ๋ operPriority ํจ์๋ฅผ ํ์ํ๊ธฐ์์ ๋ง๋ค ๋ ์ฌ์ฉํ์๋ค.
- ์์์ ๊ณ์ฐํ๋ calculate ํจ์๋
- ํ์ํ๊ธฐ์์ ๋ง๋ค๊ณ
- ํ๊ธฐ์์ ๊ณ์ฐํ๋ ์ญํ ์ ํ๋ค.
Comment