[Java] Stack 개념과 사용법(+예제)

Good_Day·2023년 3월 14일
1

자료구조

목록 보기
1/4

Stack이란?

"스택을 쌓는다" 라는 표현을 실생활에서도 간간히 사용하기 때문에,
큐와는 다르게 그나마 기억하기가 편한 것 같습니다.
자료구조의 일종으로서 큐(Queue)와는 다르게 후입선출의 형식입니다. - LIFO(Last In First Out)
나중에 들어오는 값이 가장 먼저 나가는 것으로,
큐와는 다르게 Index의 개념이 존재합니다.

큐보다 실생활에 적용, 비유되는 부분이 많습니다.
쓰레기통...바구니...벽돌쌓기...등등
쌓아간다는 개념의 모든 것들은 스텍으로 연관 지을 수 있는 것 같네요.
(우리의 지식과도 같은 모양새가 아닐까...)
깊이우선탐색(DFS)에서 사용되기도 하며, 재귀함수에도 많이 사용됩니다.

이 그림과 같이 파란색 순서로 들어와 빨간색 순서로 나갑니다.


⚙️ Stack의 선언 방법

Stack<Integer> stack = new Stack<Integer>();

Stack<객체> 변수명 = new Stack<객체>();
큐와는 달리 Stack만을 Import하여 사용합니다.

⚙️ Stack에 값을 추가하는 방법(add와 push의 차이점)

stack.pust(i);
stack.add(i);
  • Stack변수.push(값);
  • Stack변수.add(값);
    2가지 방법이 있으며, 과정은 비슷하나 결과가 다릅니다.

add의 경우 true를 return하고,
push는 push한 item을 return합니다.
상황에 따라 다르게 사용할 수 있겠지만, 가시적으로도 Stack을 사용한 것을 명시하기 위해
push를 쓰는 것이 더 명확할 것 같습니다.
하지만, add의 경우 index를 주어 특정 위치에 끼워넣는 것이 가능하기 때문에,
요건에 따라 필요에 의해 사용할 수 있습니다.

⚙️ Stack 값 출력

stack.peek();

Stack변수.peek();
이렇게 사용할 경우 현재 Stack의 가장 마지막에 들어간 값, 가장 먼저 출력될 값이 출력되게 됩니다.
큐와 동일하게 Stack이 비어있을 경우 null을 return하기 때문에, 조건식에서도 사용됩니다.

⚙️ Stack 값 삭제(출력)

stack.pop();
stack.clear();
stack.remove(i);
  • Stack변수.pop();
  • Stack변수.clear();
  • Stack변수.remove(i);
    와 같이 사용할 수 있으며, 각각의 차이를 확인해보겠습니다.

clear - Stack을 전체 비움

pop - 튀어나온다는 영어해석처럼 가장 먼저 출력할 대상을 삭제하며, 출력합니다.
= 가장 나중에 넣은 값, 가장 끝의 index

remove - remove는 index를 주지 않을 경우 pop과 동일하게 가장 먼저 출력할 대상을 삭제하고,
파라미터로 index를 줄 경우 해당 index에 해당하는 값을 삭제합니다.(해당 값 출력X)

⚙️ 그 외의 Stack 함수

Stack변수.contains(변수); = 해당 변수가 Stack 안에 존재하는 지 검증
Stack변수.empty(); = Stack이 비어있는지 검
Stack변수.firstElement; = 가장 첫번째 index의 값을 출력
Stack변수.indexOf(변수); = 파라미터로 넣은 값의 index를 출력합니다.
Stack변수.get(index); = 파라미터 index에 해당하는 값을 출력합니다.

위의 모든 예제를 활용하여 만든 예제입니다. 최대한 다양하게 사용해보았습니다...

import java.io.IOException;
import java.util.Stack;
	
public class Main{
	
	public static void main(String[] args) throws IOException{
		
		Stack<Integer> stack = new Stack<Integer>();
		
		for(int i = 1; i <= 5; i++) {
			stack.push(i);
		}
		
		if(stack.peek() == 5) {
			System.out.println(stack.firstElement());
		}
		System.out.println(stack.get(0));
		System.out.println(stack);
		System.out.println("--------------------------------------------------");
		System.out.println(stack.pop());
		System.out.println(stack);
		stack.push(stack.pop());
		System.out.println("--------------------------------------------------");
		System.out.println(stack);
		stack.remove(0);
		stack.add(0, stack.pop());
		System.out.println("--------------------------------------------------");
		System.out.println(stack);
	}
}
profile
여신코어뱅킹 개발자

0개의 댓글