애들센스


VBA로 만드는 알고리즘-스택 오피스/VBA/Office.JS

토지라는 물건을 하나 두고, 상업용,공업용,주거용,농업용 토지 등 우리는 여러 가지로 구분하여 사용하듯이, '메모리'라는 공간을 두고 필요에 따라 여러 알고리즘으로 활용한다. 스택,큐,리스트(링크드),트리 등등. 현대의 프로그래밍언어는 이런 알고리즘을 아예 지원을 해주지만, 예전에는 직접 만들어 사용하였다. 그래서 이런 알고리즘은 학교에서 배우거나 프로그래머 면접용으로 사용되거나 한다. 이런 알고리즘을 직접 만들 필요는 많이 줄었지만, 기초에 해당하는 것이라 알아둘 필요는 있어 보인다.

스택(Stack)은 끝이 막혀있는 구조로 나중에 입력(push)된 항목이 먼저 나오는(pop) 후입선출형 알고리즘이다. 데이터를 입력하는 것을 PUSH라고 하고, 데이터를 꺼내는 것을 POP이라고 한다. POP을 하면 해당 항목은 스택에서 제거된다. 위의 그림에 '1'을 PUSH하고 , 다음에 '2'를 PUSH한다. 이제 POP을 하면 '2'가 스택에서 나오고 '1'만 남는다.

프로그래밍을 하면서 만나는 스택은 재귀적 호출 함수를 만드는 경우이다. 함수가 자신을 다시 호출하는 구조인데, 호출할때마자 메모리주소를 스택에 쌓아두었다가, 연산이 끝나면 스택에 저장된 함수의 주소를 메모리에서 풀어주게 된다. 즉 마지막에 입력된 함수주소가 먼저 꺼내지는 것이다.


VBA에서 스택을 구현하려면 클래스모듈을 사용하는 데, 이번 예에서는 두 개의 클래스를 만든다. 하나는 스택에 들어갈 항목을 정의하는 StackItem클래스이고, 나머지 하나는 스택의 메서드 PUSH, POP을 구현한 Stack클래스이다.
[StackItem.cls]
Public Value As Variant '// 항목을 저장할 멤버변수
Public pItem As StackItem '// 이전항목을 위한 변수

Private Sub Class_Initialize()
'// 클래스 생성자로서 처음에 빈 스택이므로 Nothing이다
'// PUSH를 할때 실행된다
Set pItem = Nothing
End Sub

Private Sub Class_Terminate()
'// 클래스 소멸자, POP을 할 때 실행된다
Set pItem = Nothing
End Sub
다음은 본격적인 스택클래스이다
[Stack.cls]
Dim Top As StackItem '// 마지막 입력된 항목을 가리키는 StackItem 이다.

Public Function Pop() As Variant
'// 스택에서 마지막 입력된 항목을 꺼내는 메서드함수이다
If Not IsEmpty Then
'// 스택이 비어 있지 않다면 마지막 항목을 돌려준다
'// 그리고 다음항목을 Top으로 지정한다
Pop = Top.Value
Set Top = Top.pItem
End If
End Function

Public Sub Push(ByVal nItem As Variant)
'// 스택에 데이터를 입력하는 PUSH 메서드이다.
Dim NewTop As New StackItem

NewTop.Value = nItem
'// 기존 TOP을 예전항목으로 돌리고, 새 항목을
'// TOP으로 설정한다
Set NewTop.pItem = Top
Set Top = NewTop
End Sub

'// 클래스모듈에서만 작성하는 프로퍼티 메서드이다
'// 멤버변수값을 돌려주는 프로퍼티 메서드는 Get이고
'// 멤버변수값을 설정하는 프로퍼티 메서드는 Set이다.
Property Get GetTop() As Variant
'// TOP을 돌려준다
If IsEmpty Then
GetTop = Null
Else
GetTop = Top.Value
End If
End Property

Property Get IsEmpty() As Boolean
'// 스택이 비어 있는 지 여부를 알려준다
IsEmpty = (Top Is Nothing)
End Property

Private Sub Class_Initialize()
Set Top = Nothing
End Sub

Private Sub Class_Terminate()
Set Top = Nothing
End Sub
다음에는 이를 사용하는 데모이다.

A stack is a useful data structure in programming. It is just like a pile of plates kept on top of each other.
    Dim myStack As New Stack

myStack.Push "kept on top of each other."
Debug.Print "Current Top Item :", myStack.GetTop

myStack.Push "a pile of plates"
Debug.Print "Current Top Item :", myStack.GetTop

myStack.Push "It is just like"
Debug.Print "Current Top Item :", myStack.GetTop

myStack.Push "in programming."
Debug.Print "Current Top Item :", myStack.GetTop

myStack.Push "a useful data structure"
Debug.Print "Current Top Item :", myStack.GetTop

myStack.Push "is"
Debug.Print "Current Top Item :", myStack.GetTop

myStack.Push "A stack"
Debug.Print "Current Top Item :", myStack.GetTop

Debug.Print
Debug.Print "--------------------------------------"
Debug.Print "It's time to pop out"
Do While Not myStack.IsEmpty
Debug.Print "Item just popped :", myStack.Pop()
Debug.Print "Current Top Item :", myStack.GetTop
Debug.Print
Loop

덧글

  • 우왕 2020/01/15 13:39 # 삭제 답글

    또 배워갑니다~! 감사합니다~!
댓글 입력 영역