Stack을 Java로 구현해보자.

MJ_Vly·2022년 5월 24일
0

자료구조

목록 보기
1/4

Stack

- FILO(후입선출)이 대표적인 특징

- 한쪽으로 입력과 출력이 이루어진다.

- 그래프의 깊이 우선 탐색에서 쓰인다.

- 재귀적 함수 호출에서 사용된다.

- push(값) : 입력값 add

- pop() : 가장 상단의 값 삭제

- clear() : stack 비우기

- peek() : 가장 상단의 값 return

- empty() : 값이 비어있는지 check 비어있다면 true, 아니라면 flase 반환

- contains(값) : stack 안에 해당 값이 있는 지 확인. 있다면 true, 아니라면 flase 반환

해당 Stack을 Java로 구현해보았다.

인터페이스 작성

public interface Stack {
	boolean isEmpty();
	boolean isFull();
	boolean contains(char item);
	char pop();
	void push(char item);
	void clear();
	char peek();
}

아래는 class 작성

public class ArrStack implements Stack {
	
	private int top;
	private int stackSize;
	private char ArrStack[];
	
	
	public ArrStack(int stackSize) {
		this.stackSize = stackSize;
		//만약 데이터가 없으면 -1
		top = -1;
		ArrStack = new char[this.stackSize];
	}
	
	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		//top이 -1이라면 빈 배열
		return (top == -1);
	}

	@Override
	public boolean isFull() {
		// TODO Auto-generated method stub
		//top이 stackSize-1 즉, 배열의 크기만큼 커졌다면 Full
		return (top == this.stackSize-1);
	}

	@Override
	public char pop() {
		// TODO Auto-generated method stub
		if(isEmpty()) {
			System.out.println("already Empty");
			return 0;
		}else {
			System.out.println("pop: "+ArrStack[top]);
			//pop한 값을 출력한 후 ArrStack[top]을 retuen 해주고 -1하여 pop 구현
			return ArrStack[top--];
			
		}
	}

	@Override
	public void push(char item) {
		// TODO Auto-generated method stub
		if(isFull()) {
			System.out.println("Stack is Full");
		}else {
			//처리해주기 전 top+1 해주어 push
			ArrStack[++top] = item;
			System.out.println("push: "+item);
		}
	}

	@Override
	public void clear() {
		// TODO Auto-generated method stub
		if(isEmpty()) {
			System.out.println("already clear");
		}else {
			//top을 초기화 시켜주고 새로운 배열을 생성
			top = -1;
			ArrStack = new char[this.stackSize];
			System.out.println("clear ok");
		}
	}

	@Override
	public char peek() {
		// TODO Auto-generated method stub
		System.out.println("peek :"+ ArrStack[top]);
		return ArrStack[top];
	}
	
	@Override
	public boolean contains(char item) {
		for(int i=0; i<=top; i++) {
			if(item == ArrStack[i]) {
				return true;
			}
		}
		return false;
	}
	
	public void printArrStack() {
		for(int i=0; i<=top; i++) {
			System.out.print(ArrStack[i]+" ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		//배열의 사이즈를 정해줌
		int stackSize = 5;
		//사이즈를 기반으로 배열 선언
		ArrStack arrStack = new ArrStack(stackSize);
		char a,b;
		
		arrStack.push('A');
		arrStack.printArrStack();
		
		arrStack.push('B');
		arrStack.push('C');
		
		arrStack.printArrStack();
		//peek 같은 경우 char을 리턴하여 리턴값이 있음.
		a = arrStack.peek();
		System.out.println("a: "+a);
		
		//pop 같은 경우 char을 리턴하여 리턴값이 있음.
		b = arrStack.pop();
		System.out.println("b: "+b);
		arrStack.push('A');
		arrStack.printArrStack();
		System.out.println("A가 있는가? "+arrStack.contains('A'));
		arrStack.clear();
		arrStack.printArrStack();
		arrStack.clear();
		
		
	}
}
profile
조금씩 쌓아가는

0개의 댓글