[자료구조]Java로 Stack 구현해보기 (List 활용)


지난시간에 자료구조 파헤치기를 통해 Stack 구조에 대해서 정리해보았습니다. (페이지로)

 

이번에는 Stack구조를 Java로 만들어 보려합니다. (List 활용)

어렵지 않게 단순히 데이터를 저장할 Stack변수와 Pop 함수 및 Push 함수를 구현해 볼까 합니다.

 

아래는 개발전 설계한 Class-Diagram입니다.

Stack의 Class-Diagram

Class-Diagram 설명

 - stack 변수 : List형식으로 되어있으며, 값을 넣기(push) 위한 공간이라 생각하시면 됩니다.

 - popValues 변수 : 이는 stack변수에서 빠진(pop) 값을 담아두기 위한 공간입니다. (단순히 어떤식으로 빠지나를 확인하기 위한 용도입니다.)

 - push 함수 : String 값을 받아오면 stack 변수에 입력(push) 해줍니다.

 - pop 함수 : stack 변수에서 마지막 값을 꺼냅니다.(pop) 

 - printStack 함수 : push 및 pop 등의 과정을 거쳐 현재 상태를 console창에 print 해줍니다.

 - printPopValue 함수 : pop된 데이터 값을 순서대로 보여줍니다.(popValues 활용)

 

완성 소스 (소스는 github에도 업로드하였습니다. - 링크)

/**
 * Stack 클래스
 * @author karzin
 *
 */
public class Stack {
	
	//Stack 변수 생성 (List)
	private List<String> stack = null;
	
	//Stack 변수에서 pop된 데이터를 저장
	private List<String> popValues = null;
	
	//생성자 - stack을 초기화해줌
	Stack() {
		stack = new ArrayList<String>();
		popValues = new ArrayList<String>();
	}
	
	//stack에 값을 넣음(push)
	public void push(String pushValue) {
		stack.add(pushValue);
	}
	
	//stack에서 값을 뺌(pop)
	public String pop() {
		String popValue = "Stack이 비어있습니다.";
		
		if(stack.size() > 0) {
			popValue = stack.remove(stack.size()-1);
			popValues.add(popValue);
		} else {
			System.err.println(popValue);
		}
		
		return popValue;
	}
	
	//stack 내부에 있는 값을 모두 출력한다.
	public void printStack() {
		int i = 0;
		
		for(String value : stack) {
			if(i < value.length()) {
				i = "| ".length() + value.length() + " |".length();
			}
		}
		
		for(int s = stack.size()-1; s >= 0; s--) {
			int length = "| ".length() + stack.get(s).length() + " |".length();
			length = i-length;
			System.err.print("| "+stack.get(s));
			for(int j = 0; j < length; j++) {
				System.err.print(" ");
			}
			System.err.print(" |");
			System.err.println();
			for(int j = 0; j < i; j++) {
				System.err.print("-");
			}
			System.err.println();
		}
		
		System.err.println();
	}
	
	//popValues 변수에 있는 값을 순서대로 보여줌.
	public void printPopValue() {
		System.out.print("popValues ==> ");
		System.out.println(popValues);
		
		System.out.println();
	}

}

 

테스트해보기 (Main Class 생성 및 실행 -> 소스는 github에도 업로드하였습니다. - 링크)

stack.push("A");
stack.printStack();

stack.push("B");
stack.printStack();

stack.pop();
stack.printPopValue();

stack.push("C");
stack.printStack();

stack.pop();
stack.printPopValue();

stack.pop();
stack.printPopValue();

 

결과

-> Debug 모드로 실행하셔서 한줄 한줄 어떤식으로 바뀌는지 확인해보시면 더욱 이해하기 쉽습니다.

---

졸면서 하느라고 함수도 소스도 많이 적은느낌이네요.

버그같은거 있다면 댓글남겨주시면 최대한 바로 수정하겠습니다.

감사합니다.

 

 

** 그림에 사용된 글자체는 네이버 나눔글꼴의 나눔스퀘어 Bold입니다.

 

버전정보 (v1.1)

 - v1.0 2020.06.18 배포

 - v1.1 2020.06.23 제목 말머리 [자료구조] 추가

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Karzin

abbeea@naver.com





[자료구조 파헤치기] Stack구조란


간만에 자료구조나 뒤집어엎어보자는 생각에 하나씩 다뤄볼까 싶어서 한번 꺼내봤습니다.

아마 버전은 시간나는 틈틈이 제가 다룰 수 있는 모든 언어로 다뤄볼 예정입니다.

 

그럼 우선 첫번째로 Stack구조는 어떤형식의 구조인지를 한번 파악해보시죠.

이거 하나만 알면 됩니다. LIFO!

 

LIFO

LIFO의 의미는 후입선출(Last In First Out)이라는 의미로 맨 마지막에 들어온(Push) 데이터가 처음으로 빠져나간다고(Pop) 보시면 됩니다.

 

조금 쉽게 생각을 해보자면 창고에 박힌 상자를 생각해보시면 될 것 같습니다.

창고에 아래서부터 차근차근 상자를 쌓아 올려놨다면, 상자를 꺼내기 위해서는 맨 위에 있는 상자부터 꺼내게 될겁니다.

 

백문이 불여일견. 말보다는 눈으로 직접 보면서 설명드리겠습니다.

데이터를 넣고(Push) 빼는(Pop) 작업을 잘 확인해보세요!

 

 - 아래 보시는 이미지는 Stack과 데이터 A, B, C를 준비했습니다.

Stack의 구조

 

 - Stack에 데이터 A를 넣고, (Push)

A를 Stack에 Push

 

- 다시한번 더 데이터 B를 Stack에 넣습니다. (Push)

B를 Stack에 Push

 

 - 그럼 A와 B가 들어간 Stack에서 데이터를 뺀다면 어떤 데이터가(A?, B?) 빠져나올까요? (Pop)

Stack에서 Pop을 한다면

 

 - 정답은 B입니다.

  -> Stack은 LIFO. 즉, Last In First Out이기 때문에 맨 마지막에 들어간(Push) 데이터가 나오는(Pop) 형식입니다.

Stack에서 Pop을 한다면 데이터 B가 나옵니다.

 

 - 계속해서 진행을 해보면 C라는 데이터를 넣고(Push) 뺀다면(Pop) 이 또한 맨 마지막에 들어온(Push) C가 나오는(Pop) 형식입니다. (Last In First Out)

Stack에 데이터 C를 Push 후 Pop을 하면 데이터 C가 나옵니다.

 

- 마지막으로 데이터를 뺀다면(Pop) B-C-A 순으로 나오게 됩니다.

B-C-A순으로 데이터가 나옵니다.(Pop)

 

항상 맨 마지막에 들어온 데이터가 맨 처음으로 나온다는걸(LIFO - Last In First Out) 잘 기억해주세요.

이 LIFO만 잘 이해 하셨다면 Stack구조는 다 이해하신겁니다!

 

 # Stack을 소스로 만들어 보기

  ▷ JAVA-List : [자료구조]Java로 Stack 구현해보기 (List 활용) -> 링크로 이동

 

 

** 그림에 사용된 글자체는 네이버 나눔글꼴의 나눔스퀘어 Bold입니다.

 

버전정보 (v1.1)

 - v1.0 2020.06.17 배포

 - v1.1 2020.06.23 내용 추가

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Karzin

abbeea@naver.com

 

 

 

+ Recent posts