본문 바로가기

Coding Note

[Data Structure] Stack

스택은 글자 그대로 '무더기' 를 말한다.
그럼 자료구조에서의 스택이란 어떤 '무더기'를 뜻하는 것일까

자료구조에서 무더기가 데이터(data)말고 뭐가 있겠는가 하하,,

링크드리스트가 데이터들을 엮어서 관리하는 구조라면,
스택은 자료들을 가지런히 쌓아놓아서 관리하는  구조라고 이해하면 되겠다.

그럼 스택이라는 구조가 가지는 기본적인 특징을 살펴보자.

바로 데이터를 다루기 전에..  감자전에 대해서 생각해보자 (보통 팬케익을 예로들지만.. 한국인이라면 전!)
①감자전을 부친 후, 접시에 차곡차곡 쌓아올렸다.
그리고 나서 감자전을 먹을땐,
②맨 마지막에 올려둔(맨 위에있는)감자전을 처음으로 먹게된다. (물론 나는 아래쪽에부터 들쑤시지만) 

자료구조에서의 스택도 감자전을 부치고, 먹는과정과 완전히 같다.
데이터를 스택에 집어넣고,
나중에 데이터를 뺄 일이 있어서 빼려고 하면 가장 마지막에 넣었던 데이터를 뽑아내는것이다.

이런 과정을,
데이터를 스택에 넣는과정 = Push
스택에서 빼는 과정          = Pop

이라고 한다.
(스택의 가장 주요한 기능은 push와 pop이 전부이다.)

그런데 이런 구조가 도대체 어디에 쓰이는 걸까?
간단한 예로 그림판의 ctrl+z의 기능은, 우리가 모르게 지금까지 그려가던 작업들을 스택에 쑤셔뒀기 때문에
가능한 작업이다.

이런 추상적인 스택구조가 말고도, 프로그래밍을 할 때 지역변수(자동변수)를 저장하는 곳 또한 스택영역이다.
(아, 스택영역도 추상적인 구조라고 해야하나??  모르겠다)

어셈블리어를 배워봤다면 스택의 중요성에 대해서 훨씬 실감할 수 있을것이다.

..

좋다. 스택이 뭔지는 알았으니 어떻게 짜여지는지 한번 보자.
스택을 구성할 때는, 배열을 이용한 스택구조와 리스트를 이용한 스택구조가 있다.
배열을 이용한다면 구성하기가 매우 쉽고, 빠르다는 장점이 있으나 배열의 크기가 정적이기 때문에 데이터의 입력에 제한을 받는다.
하지만, 리스트를 이용한 스택구조는 크기의 제한에서 벗어나기 때문에 사용자의 입장에서는 훨씬 좋지만, 컴퓨터의 입장과 프로그래머의 입장에서는 부담이 된다.

일단 스택구조에서 쓰이는 용어 몇가지에 대해 알아보자.(push, pop빼곤 전부 스택의 활용을 높이기 위한 부수요소이다.)
push : 데이터를 스택에 집어넣는다.
pop   : 데이터를 꺼낸다.
top    : 스택의 가장 꼭대기를 가리킨다.
bottom : 반대로 가장 아래를 가리킨다.
capacity: 스택의 용량

여기까지 알고 아래 코드를 본다면, 대부분 이해할 수 있으리라 생각된다.

배열을 생성해주고, 집어넣고 빼고..  가 전부이며, 스택이 비어있는지 꽉 차있는지 정도만 검사해주면 된다.

그럼 링크드리스트를 이용해서 스택을 만들면 어떻게될까?
(아래 코드는 스택의 데이터제한을 없에려고 void*형의 데이터를 이용했지만,
  편한데로 int 등등의 데이터를 써도 상관없다.)

배열스택보단 조금 복잡하지만, 리스트를 직접짜봤다면 별거 없다는걸 알수있다.

차이점은 배열스택과 달리 노드를 만들어서 엮어주고 있고, top대신 *topNode를 사용해서 가장 높은 위치의 노드를 가리키고있다.
그리고 스택공간의 자유도가 높아진 만큼 공간을 정리해주는 작업또한 우리가 해줘야 한다는 것!

..

이렇게 스택에 대해서 마무리 하고,
스택의 활용은 사용하는 사람의 몫


'Coding Note' 카테고리의 다른 글

[Network] 네트워크란?  (1) 2011.09.07
[Data Structure] Queue  (0) 2011.08.12
[Data Structure] Circular double linked list  (0) 2011.08.03
[Data Structure] Linked List  (0) 2011.08.03
[C++] 포인터 이해를 위한 Linked List  (0) 2011.05.09