스택(STACK)은 포인터를 사용해 데이터를 저장하고 불러오는 자료구조(DATA STRUCTURE)입니다.

데이터를 저장하고 불러오기 위해서 스택은 PUSH와 POP, 이 두개의 주요 메소드(METHOD)를 사용합니다.

PUSH를 통해 데이터를 추가하고, POP을 통해 데이터를 삭제합니다.

스택에서의 PUSH와 POP은 추가되고 제거되는 데이터의 위치가 결정되어 있습니다.

PUSH 메소드를 호출하게 되면 데이터는 가장 최근에 추가된 데이터의 다음에 추가되게 됩니다.

POP 메소드를 호출하게 되면 가장 최근에 추가된 데이터가 스택에서 삭제됩니다.

이러한 구조를 Last In First Out(LIFO), 선입선출 구조라고도 하죠.

PUSH와 POP 연산의 이름은 식당에 있는 접시 받침 스프링에서 유래되었다고 합니다.

접시를 스프링으로 받쳐 올려주는 접시 스택이 어떤건지 저는 감이 잘 잡히지 않아서 다른 예시를 생각해 봤습니다.

헬스장에서 쓰는 플레이트인데요, 밑에 보이는 봉에 새로운 플레이트를 놓고싶다면(PUSH) 가장 나중에 추가된 플레이트의 바로 위에 놓을 수 밖에 없습니다.

그리고 하나의 플레이트를 뺐다면(POP) 그건 가장 위쪽에 있는 플레이트일 수 밖에 없죠.

마찬가지로 가장 밑쪽의 플레이트를 빼고 싶다면 그 위의 플레이트를 차례로 모두 빼야합니다.


아래는 자바로 스택을 구현한 예시 코드입니다.


public class Stack {


private int top; 

private int size;

private Integer[] list;


public Stack(int size) {

top = -1;

list = new Integer[size];

this.size = size;

}// Stack.constructor


boolean isEmpty() {

if (this.top == -1)

return true;

else

return false;

}// Stack.isEmpty


void push(int input) {

if(top == size-1) {

System.out.println("stack is full. you cannot push anymore.");

return;

}

this.top += 1;

this.list[top] = input;

System.out.println(input + " is pushed.");

}// Stack.push


void pop() {

if (this.isEmpty()) {

System.out.println("stack is empty. you cannot pop anymore");

return;

}

else {

System.out.println(list[top] + " is popped. ");

this.top -= 1;

}

}// Stack.pop


void print() {

if (this.top == -1) {

System.out.println("stack is empty.");

} else {

System.out.print(" stack = [ ");

for (int i = 0; i <= top; i++) {

if (list[i] != null) {

System.out.printf("%d ", list[i]);

if (i != top)

System.out.print(",");

}

}

System.out.println("] ");

}

}// Stack.print