μλ£κ΅¬μ‘° λ° μ€μ΅ - [6] μ€ν Stack (νμ΄μ¬μΌλ‘ μ€ν ꡬν) (1)
μ€ν ADT
μ€ν ADTλ μμμ κ°μ²΄λ₯Ό μ μ₯νλ νλμ μΆμ μλ£νμ΄λ€.
μ€νμ μ€μν νΉμ§μΌλ‘λ LIFO (Last - In First - Out), νμ μ μΆμ΄λ€. νμ μ μΆμ΄λ λ§ κ·Έλλ‘ κ°μ₯ λ§μ§λ§μ λ€μ΄μ¨ κ²μ κ°μ₯ λ¨Όμ κΊΌλ΄λ κ²μ΄λ€. μ΄λ λλΌν΅μ μμ£Ό λΉμ λκ³€ νλ€.
μ€νμμ λ°μ΄ν°μ μ½μ κ³Ό μμ λ μ€νμ topμ΄λΌ λΆλ¦¬λ μμΉμμ μνλλ€.
μ€ν ADT λ©μλ
μ€ν ADTμ λ©μλλ₯Ό μμ보μ.
- μ£Όμ μ€ν λ©μλ
push : μμλ₯Ό μ½μ νλ€.
element pop : κ°μ₯ μ΅κ·Όμ μ½μ λ μμλ₯Ό μμ νμ¬ λ°ννλ€.
- 보쑰 μ€ν λ©μλ
element top() : κ°μ₯ μ΅κ·Όμ μ½μ λ μμλ₯Ό (μμ νμ§ μκ³ ) λ°ν
integer size() : μ μ₯λ μμμ μλ₯Ό λ°ν
boolean isEmpty() : μ무 μμλ μ μ₯λμ΄ μμ§ μκ³ λΉμ΄ μλμ§ μ¬λΆλ₯Ό λ°ν
iterator elements() : μ€ν μμ μ 체λ₯Ό λ°ν
- μμΈ
emptyStackException() : λΉμ΄ μλ μ€νμμ μμ λ topμ μλν κ²½μ° λ°λ Ή
fullStackException() : λ§μ μ€νμμ μ½μ μ μλν κ²½μ° λ°λ Ή
μ€ν ADT ꡬν
μ€ν ADTλ λ€λ₯Έ κ²κ³Ό λ§μ°¬κ°μ§λ‘ λ°°μ΄κ³Ό μ°κ²°λ¦¬μ€νΈλ₯Ό μ΄μ©νμ¬ κ΅¬νν μ μλ€.
νμ΄μ¬μμλ 리μ€νΈλ‘ μ€νμ μμ½κ² νλ΄λΌ μ μλ€.
>>> a = []
>>> a.append(1) # 1 μΆκ°
>>> a.append(2) # 2 μΆκ°
>>> print(a)
[1,2]
>>> a.pop() # 2 κΊΌλ
>>> print(a)
[1]
μ°κ²°λ¦¬μ€νΈμ κΈ°μ΄ν μ€ν
λ¨μΌ μ°κ²°λ¦¬μ€νΈλ₯Ό μ¬μ©νμ¬ μ€νμ ꡬνν μ μλ€. μ΄λ μ½μ κ³Ό μμ κ° νΉμ μμΉμΈ topμμλ§ μνλλ―λ‘ ν€λλ Έλλ νμμλ€.
μ΄κΈ°ν
μ΄κΈ°μλ μ무 λ Έλλ μλ€.
μ½μ
μ½μ ν topμ κ΄λ¦¬λ₯Ό μν΄μΌ νλ€.
μμ
μμ λν μ½μ κ³Ό λ§μ°¬κ°μ§λ‘ topμ κ΄λ¦¬λ₯Ό μν΄μΌ νλ€.
μ΄λ₯Ό νμ΄μ¬ μ½λλ‘ κ΅¬ννλ©΄ λ€μκ³Ό κ°λ€.
#λ¨μΌμ°κ²°λ¦¬μ€νΈμ κΈ°μ΄ν μ€ν
class Node:
def __init__(self,data,next=None):
self.data = data
self.next = next
class stack:
def __init__(self,N): #μ΄κΈ°ν
self.top = None
self.full = N
self.stacksize=0
def push(self,data): # μ½μ
newnode = Node(data,self.top)
self.top = newnode
self.stacksize +=1
def isEmpty(self): # isEmpty
if self.top == None:
return True
else:
return False
def pop(self): # pop
if self.isEmpty():
print("Stack Empty")
elem = self.top.data
p = self.top
self.top = self.top.next
del(p)
self.stacksize -=1
# print("pop :",elem) #popν μμλ₯Ό μΆλ ₯
return elem
def printstack(self): # μ€νprint
target = self.top
if self.isEmpty():
print("None")
else:
while (target.next != None):
print(target.data,end = ",")
target = target.next
print(target.data)
def peek(self): # topμ μλ μμ μΆλ ₯
if self.top == None:
print("Stack Empty")
else:
print(self.top.data)
def duplicate(self): # popν κ°μ μμ λλ² push
new = self.pop()
if self.stacksize ==self.full:
print("Stack Full")
else:
self.push(new)
if self.stacksize ==self.full:
print("Stack Full")
else:
self.push(new)
>>> a = stack(5)
>>> a.push('C')
>>> a.push('B')
>>> a.push('A')
>>> a.printstack()
A,B,C
>>> a.pop() #Aλ₯Ό μμ νκ³ μΆλ ₯
A
>>> a.peek() # popκ³Ό λ¬λ¦¬ μμ νμ§ μκ³ topμ μ μ₯λ μμ μΆλ ₯
B
>>> a.duplicate() # 볡μ¬
>>> a.printstack()#print
B,B,C