자료구조

스택 (Stack)

커피마시기 2023. 10. 16. 23:28

 

Stack 이란

  • 스택(stack)의 사전적 정의는 '쌓다', '더미'로서 데이터를 쌓는 자료 구조라고 할 수 있다
  • 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 구조 특징을 가지고 있는데 이러한 구조를 LIFO(Last In First Out) 구조라고 말한다 
  • 직전의 데이터를 빠르게 가져올 수 있는 장점이 있어 뒤로가기, 실행취소 , 컴퓨터 구조의 스택 메모리가 대표적이다

stack

 

 

 

●  Stack 사용법

메소드 설명
boolean empty() Stack이 비어있는지 알려준다 
push() Stack에 객체를 저장한다
pop() Stack의 맨 마지막에 저장된 객체를 빼낸다
비어있는 경우 EmptyStackException 발생
peek() Stack의 맨 마지막에 저장된 객체를 반환
pop과 달리 삭제되지는 않는다
비어있는 경우 EmptyStackException 발생
search() Stack에서 주어진 객체를 찾아서 그 위치를 반환
못 찾을경우 -1을 반환

 

 

  • 요소 넣기 꺼내기

stack에 데이터를 추가하는 동작은 push() 메소드를 사용하며 요소를 추가하고, 데이터를 빼는 동작은 pop()를 사용한여 LIFO의 구조로 꺼내지게 된다

public class Main {

	public static void main(String[] args) {
		
		Stack<Number> stack = new Stack<>();
		
		stack.push(1);
		stack.push(2);
		stack.push(3);
		
		System.out.println(stack); // [1, 2, 3]
		
		stack.pop();
		
		System.out.println(stack); // [1, 2]
        
      	  	stack.pop();	
        
      		System.out.println(stack); // [1]
	}
}

 

 

 

  • Stack 최상단 요소 가져오기

stack에 들어있는 요소들 중 최상단 값을 확인만 하고 스택에서 삭제하고 싶지 않은 경우 peek() 메소드를 사용하면 데이터를 확인 할 수 있다

public class Main {

	public static void main(String[] args) {
		
		Stack<Number> stack = new Stack<>();
		
		stack.push(1);
		stack.push(2);
		stack.push(3);
		
		System.out.println(stack.peek()); // 3
		
		System.out.println(stack); // 확인은 하되 제거 되지 않고 [1, 2, 3]이 나온다
	}
}

 

 

  • Stack 공간이 비어있는지 확인
public class Main {

	public static void main(String[] args) {
		
		Stack<Number> stack = new Stack<>();
		
		stack.push(1);
		stack.push(2);
		stack.push(3);
		
		System.out.println(stack.isEmpty()); // 비어 있다면 true 반환 그렇지 않다면 false
		
		if(!stack.isEmpty()) {
			stack.pop();
		}
		System.out.println(stack);  // [1, 2]
	}
}

 

 

 

  •  Stack 요소 위치 확인

Stack에 특정 데이터가 존재하는지 확인 하기위해 search() 메소드를 사용할 수 있다, 데이터가 존재하면 순서를 반환하고 존재하지 않는다면 -1을 반환한다. 주의할 점이 있다면 배열 인덱스처럼 0부터 시작하여 그 위치를 반환하는 것이 아니라 pop() 메소드를 호출했을때 몇번째로 나오는지에 대한 인덱스를 반환한다. 만일 반환값이 1이라면 가장 먼저 pop() 되는 요소라고 보면 된다

public class Main {

	public static void main(String[] args) {
		
		Stack<String> stack = new Stack<>();
		
		stack.push("김민재");
		stack.push("손흥민");
		stack.push("이강인");
		stack.push("황희찬");
		
		System.out.println(stack); // [김민재, 손흥민, 이강인, 황희찬]
		
		System.out.println(stack.search("황희찬")); // 1
		System.out.println(stack.search("손흥민")); // 3
	}
}
Stack 클래스의 경우 ArrayList 처럼 동적 공간으로, 처음 Stack 생성 시 10개의 데이터를 저장할 수 있는 공간이 할당되고 push() 메소드를 통해 요소가 10개가 넘어가게 되면, 현재 Stack 사이즈의 2배에 해당하는 공간을 할당하고 기존 데이터를 복사한다.

 

 

 


 

 

 

■  Stack 활용해보기

 

	public static void main(String[] args) {
		/*
		 *문자열 중괄호를 입력 받아 문자 '{'의 각 갯수가 짝수이면 true 
       		 *그게 아니라면 false를 반환 (stack 사용)
		 * ex) {{}{}{{}}} -> true {{}}}{} -> false
		 */
		Scanner sc = new Scanner(System.in);

		System.out.print("입력하세요 >> ");
		String str = sc.next();

		char[] ch = str.toCharArray();
		Stack<Character> stack = new Stack<>();

		for (char c : ch) {
			if (c == ('{')) {
				stack.push(c);
			}else if(c == ('}')) {
				stack.pop();
			}else {
				throw new EmptyStackException();
			}
		}
		System.out.println(stack.isEmpty());
	}

짝이 알맞게 되어 true가 나오는것을 볼 수 있다

 

'{' 의 갯수가 '}' 보다 많아  '}' 인 경우에 pop()을 통해 삭제( '{' )를 하게하였는데 남은 stack에는 '{' 하나가 남아 있어 짝이 맞지않다

 

 

pop()되는 '{ ' 보다 '}'갯수가 더 많아 짝이 맞지않아 EmptyStackException 발생

 

 

 

 

 

 


 

 

Today short review 

 

 

자료구조 및 알고리즘 또한 공부하고 있는데 아직 시작한지 초반부이지만 기존의 알고 있는 부분보다 더 깊게 들어가는거 같아서 조금 어렵긴하다 그래도 배우면서 알아가는 과정이 시간도 잘가고 재밌는거 같다

'자료구조' 카테고리의 다른 글

LinkedList 구조  (0) 2023.11.12
ArrayList 구조  (0) 2023.11.01