티스토리 뷰

제너릭의 예제로 많이 등장하는 것이 스택이다. 스택이란 데이터를 Last In, First Out으로 저장하는 자료구조다. 그것을 위해 push, pop 등의 연산을 제공해야 한다.

  • push : 요소 타입의 매개변수를 받아 스택에 푸시한다.
  • pop : 스택의 제일 마지막 요소를 삭제하고 그것을 돌려준다.
  • peek : 스택의 제일 마지막 요소를 반환한다. (변동 없음)
  • isEmpty : 스택이 비어있는지 여부를 boolean으로 돌려준다.
package stack;
import java.util.ArrayList;
public class Stack<T> {
	ArrayList<T> list = new ArrayList<>();
	public boolean isEmpty() {
		return list.isEmpty();
	}
	public void push(T e) {
		list.add(e);
		System.out.println("push : " + e);
		System.out.println("\t>> " + list);
	}
	public T pop() {
		if (isEmpty()) {
			System.out.println("error : pop for empty stack!!");
			return null;
		}
		T e = list.remove(list.size()-1);
		System.out.println("pop : " + e);
		System.out.println("\t>> " + list);
		return e;
	}
	@Override
	public String toString() {
		return list.toString();
	}
	public T peek() {
		if (isEmpty())
			return null;
		return list.get(list.size()-1);
	}
}

이 제너릭 클래스는 T에 어떤 타입이 들어오든 그 타입의 요소에 대해 스택의 기능을 제공해 준다. (테스트를 위해 print 문을 추가했다.) 이것을 이용하는 코드에서는 T에 원하는 타입을 지정하게 된다. (T 자리에는 클래스 타입만 가능하다. Object를 상속한...) 다음은 Integer 타입을 이용해 정수 스택을 만들어 사용하는 예다.

import java.util.Random;
public class Test {
	public static void main(String[] args) {
		Stack<Integer> nStack = new Stack<>();
		int n = 0;
		Random rand = new Random();
		for (int i = 0; i < 20; i++) {
			n = rand.nextInt(100);
			System.out.print(n + "\t:");
			if (n % 2 == 0) {
				nStack.push(n);
			} else {
				nStack.pop();
			}
		}
	}
}

20회를 반복하면서 짝수면 push, 홀수면 pop을 하고 있다. 이 프로그램을 실행한 결과는 다음과 같다.

39	:error : pop for empty stack!!
22	:push : 22
	>> [22]
73	:pop : 22
	>> []
2	:push : 2
	>> [2]
70	:push : 70
	>> [2, 70]
49	:pop : 70
	>> [2]
16	:push : 16
	>> [2, 16]
84	:push : 84
	>> [2, 16, 84]
20	:push : 20
	>> [2, 16, 84, 20]
90	:push : 90
	>> [2, 16, 84, 20, 90]

Stack<String> 스택을 이용해서 비슷한 동작을 10번 반복해 보면 결과는 다음과 같다.

String wordDict[] = {"first", "second", "third", "fourth", "fifth", "sixth", "seventh","eighth", "ninth"};

이런 스트링 배열에 대해 랜덤수를 생성하여 스택에 푸시와 팝을 반복한 결과다. (각자 연습해 보시길...)

89	:error : pop for empty stack!!
37	:error : pop for empty stack!!
42	:push : first
	>> [first]
58	:push : second
	>> [first, second]
38	:push : third
	>> [first, second, third]
32	:push : fourth
	>> [first, second, third, fourth]
49	:pop : fourth
	>> [first, second, third]
26	:push : fifth
	>> [first, second, third, fifth]
27	:pop : fifth
	>> [first, second, third]
73	:pop : third
	>> [first, second]


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함