스택 (Stack)
스택 (Stack)
- 선형 자료구조
- 프링글스처럼 한 쪽은 막혀있고 다른 한 쪽으로 과자를 꺼내거나 넣는 것
- 후입선출 (Last-In, First-Out, LIFO) 구조
마지막에 삽입한 것이 먼저 나오는 구조 - 배열 또는 리스트로 구현 가능
추상 자료형 (ADT)
자료형 | 반환값 | 내용 |
initialize() | void | 스택 초기화 |
push(Data) | void | 스택에 데이터 삽입 |
pop() | Data | 데이터 반환 후 삭제 |
peek() | Data | 데이터 반환 후 삭제하지 않음 |
isEmpty() | boolean | 스택이 비어있는지 확인 |
배열로 스택 구현
- 배열의 크기를 고정해야 함
- 스택에서 가장 마지막에 삽입된 위치를 저장하는 변수가 필요 (topIndex)
구현
- 디렉토리 구조
- ArrayStack.java
package Stack.Array; import Stack.Stack; public class ArrayStack implements Stack { // 스택 배열의 최대 크기 final private int MAX_SIZE = 10; // 가장 마지막에 삽입된 데이터의 위치 int topIndex = -1; // 스택 설정 Object[] stack = new Object[MAX_SIZE]; @Override public void initialize() { // 배열을 null로 초기화 for(int i=0; i<MAX_SIZE; i++) { stack[i] = null; } // -1 => 아무것도 삽입되지 않음 topIndex = -1; } @Override public void push(Object data) { if (topIndex == MAX_SIZE - 1){ System.out.println("더이상 공간이 없습니다."); return; } // 데이터 삽입 stack[++topIndex] = data; } @Override public Object pop() { if (isEmpty()){ System.out.println("데이터가 없습니다."); return null; } // 데이터 반환 후 삭제 return stack[topIndex--]; } @Override public Object peek() { if (isEmpty()){ System.out.println("데이터가 없습니다."); return null; } return stack[topIndex]; } @Override public boolean isEmpty() { if (topIndex == -1){ return true; } return false; } }
- ArrayStackMain.java
package Stack.Array; import Stack.Stack; public class ArrayStackMain { public static void main(String[] args) { Stack stack = new ArrayStack(); stack.initialize(); stack.push(1); stack.push(2); stack.push(3); stack.push(4); stack.push(5); stack.push(6); while(!stack.isEmpty()){ System.out.println(stack.pop()); } } }
리스트로 스택 구현
- 머리에 데이터를 삽입하는 연결 리스트와 동일
구현
- 디렉토리 구조
- LinkedListStack.java
package Stack.LinkedList; import Stack.Stack; public class LinkedListStack implements Stack { public class Node { Object data; Node nextNode; } Node head = null; @Override public void initialize() { head = null; } @Override public void push(Object data) { Node newNode = new Node(); newNode.data = data; newNode.nextNode = head; head = newNode; } @Override public Object pop() { if (isEmpty()){ System.out.println("데이터가 없습니다."); return null; } Object rData = head.data; head = head.nextNode; return rData; } @Override public Object peek() { if (isEmpty()) { System.out.println("데이터가 없습니다."); return null; } return head.data; } @Override public boolean isEmpty() { if (head == null){ return true; } return false; } }
- LinkedListStackMain.java
package Stack.LinkedList; import Stack.Array.ArrayStack; import Stack.Stack; public class LinkedListStackMain { public static void main(String[] args) { Stack stack = new LinkedListStack(); stack.initialize(); stack.push(1); stack.push(2); stack.push(3); stack.push(4); stack.push(5); stack.push(6); while(!stack.isEmpty()){ System.out.println(stack.pop()); } } }
'0x00. 자료구조' 카테고리의 다른 글
큐 (Queue) (0) | 2021.10.19 |
---|---|
스택을 이용한 후위 표기법 및 계산기 (postfix) [JAVA] (0) | 2021.10.18 |
양방향 연결 리스트 (이중 연결 리스트) (0) | 2021.10.14 |
단순 연결 리스트 (0) | 2021.10.11 |
순차 리스트 (0) | 2021.10.06 |