불로구

[ 자바 알고리즘/자료구조] - 스택 (Stack) <2> 본문

프로그래밍/알고리즘

[ 자바 알고리즘/자료구조] - 스택 (Stack) <2>

맹이맹이 2021. 2. 16. 07:44
반응형

앞에서 push, pop, peek 메서드에 대해 알아보았다.

그럼 이번에는 그 외 메서드에 대해 알아보자

 

indexOf

- 검색 메서드로서, 스택 본체의 배열에 x와 같은 값의 데이터가 있는지 위치를 알려주는 메서드

- 배열 인덱스가 큰쪽에서 작은쪽으로 스캔

- 해당 데이터가 있으면 위치를 반환, 없으면 -1반환

 

clear

- 스택에 모든 데이터 삭제

 

capacity

- 스택의 용량을 반환하는 값

 

size

- 데이터 수를 확인

 

IsEmpty

- 스택이 비어있는지 검사

- 비었으면 true / 아니면 false

 

IsFull

- 스택이 가득 찼는지 검사

- 가득 찼으면 true / 아니면 false

 

dump

- 스택안에 있는 모든 데이터 표시

- 바닥에서 꼭대기 순으로 표시

- 스택이 비었으면, 비었다고 표시한다.

 

package 스택큐.스택;

class IntStack{
	private int max;
	private int ptr;
	private int[] st;
	
	public IntStack(int capacity) {
		ptr = 0;
		max = capacity;
		try {
			st = new int[max];
		}catch (OutOfMemoryError e) {
			max = 0;
		}
	}
	
	public class EmptyStack extends RuntimeException{
		public EmptyStack() {}
	}
	
	public class OverflowStack extends RuntimeException{
		public OverflowStack() {}
	}
	
	public void push(int num) throws OverflowStack{
		if(ptr >= max) {
			throw new OverflowStack();
		}
		st[ptr++] = num;
	}
	
	public void pop() throws EmptyStack{
		if(ptr <= 0) {
			throw new EmptyStack();
		}
		System.out.println(st[--ptr]);
	}
	
	public void peek() throws EmptyStack{
		if(ptr <= 0) {
			throw new EmptyStack();
		}
		System.out.println(st[ptr-1]);
	}
	
	public int indexOf(int num) {
		for(int i=0; i<ptr-1; i++) {
			if(st[i] == num) {
				return i;
			}
		}
		return -1;
	}
	
	public void clear() {
		ptr = 0;
	}
	
	public int size() {
		return ptr;
	}
	
	public int capacity() {
		return max;
	}
	
	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.println("st["+i+"] : " + st[i]);
			}
		}
	}
}

public class 스택2 {
	public static void main(String[] args) {
		IntStack is = new IntStack(5);
		is.push(4);
		is.push(10);
		is.push(7);
		is.push(2);
		System.out.println(is.indexOf(7));
		System.out.println(is.size());
		System.out.println(is.capacity());
		is.dump();
		if(is.IsEmpty()) 
			System.out.println("스택 비었음");
		is.push(12);
		if(is.IsFull())
			System.out.println("스택 꽉참");
		is.clear();
		if(is.IsEmpty()) 
			System.out.println("스택 비었음");
		is.dump();
	}
}

- 여기서는 클래스에 메서드를 생성해서 구현했지만, switch문을 통해 구현할 수 있다.

 

 

제네릭을 이용한 스택 구현

package 스택큐.스택;

import java.util.EmptyStackException;

class Gstack<E>{
	private int max;
	private int ptr;
	private E[] stk;
	
	public Gstack(int capacity) {
		max = capacity;
		ptr = 0;
		try {
			stk = (E[]) new Object[max];
		}catch (OutOfMemoryError e) {
			max = 0;
		}
	}
	
	public static class EmptyStack extends RuntimeException{
		public EmptyStack() {}
	}
	public static class OverflowStack extends RuntimeException{
		public OverflowStack() {}
	}
	
	public void push(E data) {
		if(ptr >= max) {
			throw new OverflowStack();
		}
		stk[ptr++] = data;
	}
	public void pop() {
		if(ptr <= 0) {
			throw new EmptyStack();
		}
		System.out.println(stk[--ptr]);
	}
	
}

public class 제네릭스택 {
	public static void main(String[] args) {
		Gstack st = new Gstack(5);
		st.push(3);
		st.push("하이");
		st.push(3.41);
		st.pop();
		st.pop();
		st.pop();
	}
}

- 이렇게 제네릭을 이용하면 배열에 Integer, String, Double...등 여러타입의 데이터를 넣을 수 있다.

- 왠만하면 제네릭은 배열보다 컬렉션을 이용하자..

반응형
Comments