스택
스택은 데이터를 일시적으로 저장하기 위한 자료구조, 가장 나중에 넣은 데이터를 가장 먼저 꺼낸다.(LIFO last in first out)
스택에 데이터를 넣는 작업을 푸시라 하고 스택에서 데이터를 꺼내는 작업을 팝이라고 한다.
데이터를 스택에 푸시하고 팝하는 과정을 나타냄
1. 스택 알고리즘 구현
push() 데이터 넣는 메서드
pop() 데이터 빼는 메서드
peek() 맨 꼭대기 요소 보는 메서드
dump() 모든 요소 보는 메서드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | package myTest1; import java.util.Scanner; public class IntStack { private int max; // 스택 용량 private int ptr; // 스택 포인터 private int[] stk; // 스택 본체 // 실행 시 예외 : 스택이 비어있음 public class EmptyIntStackException extends RuntimeException{ public EmptyIntStackException(){ } } // 실행 시 예외 : 스택이 가득 참 public class OverflowIntStackException extends RuntimeException{ public OverflowIntStackException(){ } } // 생성자 public IntStack(int capacity){ ptr = 0; max = capacity; try{ stk = new int[max]; // 스택 본체용 배열을 생성 }catch(OutOfMemoryError e){ // 생성할 수 없음 max = 0; } } // 스택에 데이터를 푸시하는 메서드 public int push(int x) throws OverflowIntStackException{ if(ptr >= max){ // 스택이 가득 참 throw new OverflowIntStackException(); } return stk[ptr++] = x; } // 스택의 꼭대기에 있는 데이터를 제거(팝) 하고 그 값을 반환하는 메서드 public int pop() throws EmptyIntStackException{ if(ptr <= 0){ throw new EmptyIntStackException(); } return stk[--ptr]; } // 스택의 꼭대기에 있는 데이터를 몰래 엿보는 메서드(peek 메서드 ) public int peek() throws EmptyIntStackException{ if(ptr <= 0){ throw new EmptyIntStackException(); } return stk[ptr - 1]; } // 스택에서 x를 찾아 인덱스를 반환 public int indexOf(int x){ for(int i=ptr -1; i>=0; i--){ if(stk[i] == x){ return i; } } return -1; } // 스택을 비움 public void clear(){ ptr = 0; } // 스택의 용량을 반환 public int capacity(){ return max; } // 스택에 쌓여있는 데이터 수를 반환 public int size(){ return ptr; } // 스택이 비어있는가? public boolean isEmpty(){ return ptr <= 0; } // 스택이 가득찼는가? public boolean isFull(){ return ptr >= max; } // 스택 안의 모든 데이터를 바닥 -> 꼭대기 순서로 출력 public void dump(){ if(ptr <= 0){ System.out.println("스택이 비어있습니다."); }else{ for(int i=0; i<ptr; i++){ System.out.print(stk[i] + " "); } System.out.println(); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); IntStack stack = new IntStack(64); // 최대 64개를 푸시할 수 있는 스택 while(true){ System.out.println("현재 데이터 수 : " + stack.size() + " / " + stack.capacity()); System.out.print("(1) 푸시 (2) 팝 (3) 피크 (4) 덤프 (5) 종료 : "); int menu = scanner.nextInt(); if(menu == 0) break; int x; switch(menu){ case 1: System.out.print("데이터 : "); x = scanner.nextInt(); try{ stack.push(x); }catch(IntStack.OverflowIntStackException e){ System.out.println("스택이 가득찼습니다."); } break; case 2: try{ x = stack.pop(); System.out.println("팝한 데이터는 " + x + "입니다."); }catch(IntStack.EmptyIntStackException e){ System.out.println("스택이 비어있습니다."); } break; case 3: try{ x = stack.peek(); System.out.println("피크한 데이터는 " + x + "입니다."); }catch(IntStack.EmptyIntStackException e){ System.out.println("스택이 비어있습니다."); } break; case 4: stack.dump(); break; } } } } | cs |
결과
소스코드 첨부
'전체 > 알고리즘' 카테고리의 다른 글
재귀를 사용한 팩토리얼, 최대공약수, 하노이탑 구현 (0) | 2018.10.07 |
---|---|
배열을 사용한 큐, 링버퍼 큐, 링버퍼 활용 구현 (0) | 2018.10.07 |
이진검색 알고리즘 (구현 메소드 사용, Arrays.binarySearch 라이브러리 사용) (0) | 2018.10.03 |
선형 검색 while, for, 보초법 사용하여 구현하기 (검색 알고리즘) (0) | 2018.09.30 |
다차원 배열 사용, 2차원 배열 사용하여 윤년, 평년 일수 구하기 (0) | 2018.09.30 |