본문 바로가기

공부생각/전산잡지식

[전산잡지식] 스텍(stack)에 대한 원초적인 설명과 예



아아아주 기본적인 얘기를 해보려 한다.
스텍과 큐. 참 많이들 듣는다. 전산에서는 절대 빼먹을수 없고, 아주 중요하게 자주 쓰이는 자료구조이다.

근데 솔직히,

"스텍은 FILO(First in Last out) 이고, 큐는 FIFO(First In First Out)이다."

라는 말만 우구장창 나올뿐,
책에도 어떤자료에도 스텍과 큐가 실제로 어떻게 쓰이며,
이 자료구조가 언제 빛을 발하는지 따위는 나와 있지 않다.

그래서 개념만 알고 있을 뿐, 어따쓰는지 어따적용시킬 수 있는지 공허하기만 하다.

가장 좋은건 자료구조(Data Structure)수업을 조낸 잘들으면 되겠지만, 어찌됫건 간단하게 써본다.


위에 무려 주황색으로 써놓았듯이 스텍과 큐는 FILO와 FIFO 로 불려진다.

이 특징이 매우 중요하기때문에 스텍과 큐를 설명하라 하면 저 두마디부터 나와야 한다. 한놈씩 한번 설명해볼까?


스텍!!! STACK!! 

먼저 들어간놈이 나중에 나오는 구조. 밥그릇에 밥을 퍼넣으면 먼저 퍼넣은 밥이 맨밑에 깔리기때문에 아래쪽을 뒤집어 엎어 퍼먹는 변태아니면,

"맨 처음 퍼서 넣은밥을 (맨 밑에 깔리기에) 가장 나중에 먹게된다."

이놈이 스텍인데 어따 쓸까?
여러군데 쓸수있다. 간단하게 함수를 예로 들어볼까?

함수가 있다쳐

void a(){
  b();
  printf("First");
}

void b(){
  c();
  printf("?");
}

void c(){
  printf("Last");
}



자, a(), b(), c()라는 함수가 있어. a()를 실행시켜보자.
a()함수안에 들어가면 a()의 내용중에 b()가 있어, 그럼 b()를 실행시켜야 겠지?
b() 내용 중에는 또 c()가 들어가있네? 그래 c()로 가자.

그럼 실행순서가 a()-> b()-> c() 이렇게 된다. 하지만 a(), b()는 함수호출이후에도 여전히 할 일이 남아있다. a()를 가지고 말해보면, b()를 호출하고나서 b()가 모두 수행될때까지 기다리고, b()다음줄에 있는 printf("First")를 실행시켜야 된다는 말이다.

그럼 이런식으로 Stack을 이용해서 생각해볼까?

자 일단 CPU는 두 함수를 동시에 돌릴수 없어(쓰레드는 족가라그래 여기서는 ㅋㅋ)
숟가락이 하나밖에 없어서 두개 한번에 못퍼먹는다 이말이야. 자 그럼 설명들어간다.

a() 를 실행중인데 갑자기 b()를 부르래, 그리고 a()는 할일이 여전히 남았어. 흠.. a()를 잠시 치워둬야겠지? 밥그릇에 잠시 담아둬.
a()를 밥그릇에 잠시 담아두고 b()를 실행중인데 또 c()를 부르라네...  b()도 먹다말고 밥그릇에 넣어, 그럼 a()위에 b()가 담겨있겠지, 그리고 c()를 퍼먹어. c()다 먹었어? 그럼 밥그릇 맨위에 있는 b()를 퍼먹자. 다 먹었어? 그럼 아까 맨 처음에 넣어놨던 a()를 퍼먹자.

오 소스코드를 다 수행했구나 끄읕


여기서 보면 FILO가 확실히 보이지? a()를 맨먼저 실행했음에도 불구하고 a()를 진행시키기에는 먼저 b()함수가 종결되어야 함으로 잠시 치워두는 경우가 발생해. 이럴때 스텍이 필요한거지.  정리하면 뒤늦게 시작한것이 다 끝나야 먼저 시작한것이 끝나는 경우 스텍에 두는거지.

이런 경우 실제로 스텍을 사용해서 일을 정하는 경우도 있어.
스텍에 넣고나서 맨 위에 일부터 하나하나 꺼내서 하는경우지. 


여하튼 그래. FILO 만 죽도록 말하면 이해 안가더라는 나의 허접한 경험을 생각하면서 이렇게 썼는데 이글도 뭐 그다지 이해가 잘되는것 같지는 않은게 문제네 ㅠㅠㅠ 젠장


여하튼 그렇다고,
뱀대가리인데 어쩌라고 ㅠ