π§Ώ μ€ν(Stack) μ΄λ?
μ€ν(Stack)μ΄λ νμͺ½ λμμλ§ λ°μ΄ν°λ₯Ό μ½μ νκ³ μμ ν μ μλ μ ν μλ£κ΅¬μ‘°λ₯Ό μλ―Ένλ©°, λ§μ§λ§μΌλ‘ μ½μ λ μμκ° κ°μ₯ λ¨Όμ μμ λλ "νμ μ μΆ(LIFO, Last-In-First-Out)"μ νΉμ§μ κ°μ§λ€.
μ€ν(Stack) μλ£κ΅¬μ‘°λ λ°μ΄ν°λ₯Ό μ μ₯νκ³ κ΄λ¦¬νλλ° μ¬μ©λλ©° μ£Όλ‘ ν¨μ νΈμΆ, μ¬κ· μκ³ λ¦¬μ¦, λ€λ‘κ°κΈ° κΈ°λ₯ λ±μμ νμ©λλ€.
π μ€ν(Stack)μμμ μ°μ° μκ³ λ¦¬μ¦
μμ μ°μ° | μ½μ μ°μ° |
pop | push |
β μ€νμ push() μκ³ λ¦¬μ¦
push(S,x)
top <- top + 1; //λ§μ§λ§ μλ£ top μμ μλ£λ₯Ό μ½μ
νκΈ° μν΄ topμ μμΉλ₯Ό 1μ¦κ°μν΄
//topμ μμΉν€ μ€ν ν¬κΈ°λ³΄λ€ ν¬λ€λ©΄ μ€λ²νλ‘μ° λ°μ
if (top > stack_SIZE) then overflow;
else //μ€λ²νλ‘μ° μνκ° μλ κ²½μ° μλ μ½λ μ€ν
{
S(top) <- x; //μ€νμ topμ΄ κ°λ¦¬ν€λ μμΉμ x μ½μ
}
end push()
β‘ μ€νμ pop() μκ³ λ¦¬μ¦
pop(S)
if (top == 0)
{
overflow;
}
else //μ€νμ΄ κ³΅λ°± μνκ° μλ κ²½μ° μμ μ°μ° μν
{
return S(top); //top μ μλ μμ μμ ν λ°ν
top <- top -1; //μ€νμ μμ 1κ°κ° μμ λμμΌλ top μμΉλ₯Ό 1 κ°μμν΄
}
end pop()
π μ€ν(Stack)μ μΆμ μλ£ν
ADT Stack
createStack(S) ::= create an empty Stack S; //곡백 μ€ν S μμ±
//μ€νμ 곡백 μ¬λΆ νμΈ
isEmpty(S) ::= if (S is empty) then return true
else return false;
//μ€νμ topμ item(μμ) μ½μ
push(S, item) ::= insert item onto the top of Stack S;
//μ€νμ topμ μλ μμ λ°ν
pop(S) ::= if (isEmpty(S)) then return error
else return the top item of the Stack S;
End Stack
π μμ°¨ μλ£κ΅¬μ‘°μ μ€ν(Stack)μ ꡬν
: μ€νμ μμ°¨ μλ£κ΅¬μ‘°μΈ 1μ°¨μ λ°°μ΄μ μ΄μ©νμ¬ κ΅¬νν μ μλ€.
- μ€νμ ν¬κΈ° == λ°°μ΄μ ν¬κΈ°
- μ€ν μμμ μμ == λ°°μ΄ μμμ μΈλ±μ€
- λ³μ top == μ€νμ μ μ₯λ λ§μ§λ§ μμμ λν μΈλ±μ€
μΈλ±μ€ 0 | μ€νμ 첫 λ²μ§Έ μμ |
μΈλ±μ€ n-1 | μ€νμ n λ²μ§Έ μμ |
곡백 μν | top = - 1 |
ν¬ν μν | top = n - 1 |
β» μμ°¨ μλ£κ΅¬μ‘°λ‘ ꡬνν μ€νμ μ₯λ¨μ
μ₯μ : μμ°¨ μλ£κ΅¬μ‘°μΈ 1μ°¨μ λ°°μ΄μ μ¬μ©νμ¬ μ½κ² ꡬνμ΄ κ°λ₯ν¨
λ¨μ : 물리μ μΌλ‘ ν¬κΈ°κ° κ³ μ λμ΄ μ€ν ν¬κΈ°λ₯Ό λ³κ²½νκΈ° μ΄λ €μ
π μ°κ²° μλ£κ΅¬μ‘°μ μ€ν(Stack)μ ꡬν
- μ€νμ μμ == λ¨μ μ°κ²° 리μ€νΈμ λ Έλ
- μ€ν μμμ μμ == λ Έλμ λ§ν¬ ν¬μΈν°λ‘ μ°κ²°
- λ³μ top == λ¨μ μ°κ²° 리μ€νΈμ΄ λ§μ§λ§ λ Έλλ₯Ό κ°λ¦¬ν€λ ν¬μΈν° λ³μ
- μ΄κΈ°μ top μν == null
π μ€ν(Stack)μ μμ©_1) μμ€ν μ€ν (System Stack)
: νλ‘κ·Έλ¨μμμ νΈμΆ λ° λ³΅κ·μ λ°λ₯Έ μν μμ κ΄λ¦¬
β ν¨μ νΈμΆ λ°μ μ ν¨μ μνμ νμν μ 보λ₯Ό μ€ν νλ μμ μ μ₯
β‘ μ€ν νλ μμ μ μ₯ν κ°μ μμ€ν μ€νμ μ½μ
β’ ν¨μμ μ€νμ΄ λλλ©΄ μμ€ν μ€νμ top μμλ₯Ό μμ
β£ νλ μμ μ μ₯λμλ λ³΅κ· μ£Όμ νμΈ ν 볡κ·
--> μ κ³Όμ μ λ°λ³΅νμ¬ μ 체 νλ‘κ·Έλ¨ μνμ΄ μ’ λ£λλ©΄ μμ€ν μ€νμ 곡백 μνκ° λλ€.
π μ€ν(Stack)μ μμ©_2) μμμ κ΄νΈ κ²μ¬
: μμμ ν¬ν¨λ κ΄νΈλ€μ κ²½μ° κ°μ₯ λ§μ§λ§μ μ΄λ¦° κ΄νΈλ₯Ό κ°μ₯ λ¨Όμ λ«μμ£Όμ΄μΌ ν¨
--> νμ μ μΆ κ΅¬μ‘°μΈ Stackμ μ΄μ©νμ¬ κ΄νΈ κ²μ¬ κ°λ₯
β» μμμ μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ μ½μ΄κ°λ©° κ²μ¬ μ§ν
β μΌμͺ½ κ΄νΈλ₯Ό λ§λλ©΄ Stackμ push
β‘ μ€λ₯Έμͺ½ κ΄νΈλ₯Ό λ§λλ©΄ μ€νμ pop νμ¬ λ§μ§λ§μ μ μ₯λ κ΄νΈμ κ°μ μ’ λ₯μΈμ§ μ¬λΆ νμΈ
--> κ°μ μ’ λ₯κ° μλλΌλ©΄ μμμ μ€λ₯κ° μλ κ²
β’ κ²μ¬ μλ£ ν μ€νμ μνλ 곡백
--> 곡백 μνκ° μλ κ²½μ° μ€λ₯κ° μλ μμ
testPair()
exp <- Expression;
Stack <- null;
while (true) do
{
symbol <- getSymbol(exp);
case
{
symbol = "(" or "[" of "{" :
push(Stack, symbol);
symbol = ")" :
open_pair != "(") then return false;
symbol = "]" :
open_pair <- pop(Stack);
if (open_pair != "[") then return false;
symbol = "}" :
open_pair <- pop(Stack);
if (open_pair != "{") then return false;
symbol = null :
if (isEmpty(Stack)) then return true;
else return false;
else :
}
}
end testPair()
π μ€ν(Stack)μ μμ©_3) μμμ νκΈ°λ² λ³ν
μμ νκΈ°λ² | ||
μ μ νκΈ°λ² (Prefix Notation) | μ€μ νκΈ°λ² (Infix Notation) | νμ νκΈ°λ² (Postfix Notation) |
μ°μ°μλ₯Ό νΌμ°μ°μ μμ νκΈ° | μ°μ°μλ₯Ό νΌμ°μ°μ κ°μ΄λ°μ νκΈ° | μ°μ°μλ₯Ό νΌμ°μ°μ λ€μ νκΈ° |
+ A B | A + B | A B + |
A) μ€μ νκΈ°μ --> μ μνκΈ°μ
β μμμ κ° μ°μ°μμ λν΄ μ°μ μμλ₯Ό λ°μνμ¬ κ΄νΈλ₯Ό μ¬μ©νμ¬ νν
A * B + C / D --> ( (A * B) + (C / D) )
β‘ κ° μ°μ°μλ₯Ό κ·Έμ λμνλ μ’μΈ‘ κ΄νΈ μμΌλ‘ μ΄λ
( ( A * B ) + ( C / D ) ) --> + ( * ( A B ) / ( C D ) )
β’ 2λ² κ²°κ³Όμμ κ΄νΈλ§ μ κ±°
+ * A B / C D
B) μ€μ νκΈ°μ --> νμνκΈ°μ
β μμμ κ° μ°μ°μμ λν΄ μ°μ μμλ₯Ό λ°μνμ¬ κ΄νΈλ₯Ό μ¬μ©νμ¬ νν
A * B + C / D --> ( ( A * B ) + ( C / D ) )
β‘ κ° μ°μ°μλ₯Ό κ·Έμ λμνλ μ°μΈ‘ κ΄νΈμ λ€λ‘ μ΄λ
( ( A * B ) + ( C / D ) ) --> ( ( A B ) * ( C D ) / ) +
β’ 2λ² κ²°κ³Όμμ κ΄νΈλ§ μ κ±°
A B * C D / +
β» μ»΄ν¨ν° λ΄λΆμμμ νκΈ°λ² λ³ν
β μΌμͺ½ κ΄νΈλ₯Ό λ§λλ©΄ 무μνκ³ λ€μ λ¬Έμ μ½μ΄λ€μ
β‘ νΌμ°μ°μλ₯Ό λ§λλ©΄ μΆλ ₯
β’ μ°μ°μλ₯Ό λ§λλ©΄ μ€νμ μ½μ
β£ μ°μΈ‘ κ΄νΈλ₯Ό λ§λλ©΄ μ€νμ popνμ¬ μΆλ ₯
β€ μμμ΄ λλλ©΄ μ€νμ΄ κ³΅λ°±μ΄ λ λκΉμ§ pop νμ¬ μΆλ ₯
infix_to_postfix(exp)
while (true) do
{
symbol <- getSymbol(exp);
case
{
symbol = operand : //νΌμ°μ°μ λ§λλ©΄ μΆλ ₯
print(symbol);
symbol = operator : //μ°μ°μ λ§λλ©΄ μ€νμ push
push(stack, symbol);
symbol = ")" : //μ°μΈ‘ κ΄νΈ λ§λλ©΄ μ€νμ popνμ¬ μΆλ ₯
print(pop(stack));
symbol = null : //μμμ λ μ²λ¦¬
while (top > - 1) do //μ€νμ΄ κ³΅λ°± μνκ° λ λκΉμ§ popνμ¬ μΆλ ₯
{
print(pop(stack));
}
else :
}
}
end infix_to_postfix()
C) νμ νκΈ°λ² μμ μ°μ°
β νΌμ°μ°μ λ§λλ©΄ μ€νμ push
β‘ μ°μ°μλ₯Ό λ§λλ©΄ νμν λ§νΌμ νΌμ°μ°μλ₯Ό μ€νμμ popνμ¬ μ°μ°
β’ μ°μ° κ²°κ³Όλ₯Ό λ€μ μ€νμ push
β£ μμμ΄ λλλ©΄ μ€νμ popνμ¬ μΆλ ₯
evalPostfix(exp)
while (true) do
{
symbol <- getSymbol(exp);
case
{
symbol = operand :
push(Stack, symbol);
symbol = operator :
opr2 <- pop(Stack);
opr1 <- pop(Stack);
//μ€νμμ κΊΌλΈ νΌμ°μ°μλ€μ μ°μ°μ ννλ‘ μ°μ°ν¨
result <- opr1 op(symbol) opr2;
push(Stack, result);
symbol = null :
print(pop(stack));
else :
}
}
end evalPostfix()