Stack

김수민·2023년 3월 21일
0

백엔드 부트캠프

목록 보기
28/52

Stack

  • 데이터(data)를 순서대로 쌓는 구조

Stack의 특징

  1. LIFO(Last in First Out): 먼저 들어간 데이터는 제일 나중에 나오는 후입선출의 구조
1) 1, 2, 3, 4를 차례대로 스택에 넣음

Stack<Integer> stack = new Stack<>(); //Integer형 스택 선언

stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
---------------------------
1 <- 2 <- 3 <- 4
---------------------------
들어간 순서대로, 1번이 제일 먼저 들어가고 4번이 제일 마지막으로 들어가게 됨

예2) 스택에 빌 때까지 데이터를 전부 빼냄

stack.pop();
stack.pop();
stack.pop();
stack.pop();
---------------------------
---------------------------
4, 3, 2, 1
제일 마지막에 있는 데이터부터 차례대로 나오게 됨
  1. 데이터는 하나씩 넣고 뺄 수 있음
    Stack 자료 구조는 데이터가 아무리 많이 있어도 하나씩 데이터를 넣고 뺌. 한꺼번에 여러 개를 넣거나 뺄 수 없음

  2. 하나의 입출력 방향을 가지고 있음
    Stack 자료 구조는 데이터의 입출력 방향이 같음. 만약 입출력 방향이 여러 개라면 Stack 자료 구조라고 볼 수 없음

Stack의 실사용 예제

브라우저에서 자료 구조 Stack이 사용될 때에는 다음과 같은 순서를 거침.
1. 새로운 페이지로 접속하 ㄹ때 연재 페이지를 Prev Stack에 보관함
2. 뒤로 가기 버튼을 눌러 이전 페이지로 돌아갈 때에는 현재 페이지를 Next Stack에 보관하고 Prev Stack에 가장 나중에 보관된 페이지를 현재 페이지로 가져옴
3. 앞으로 가기 버튼을 눌러 앞서 방문한 페이지로 이동을 원할 때에는 Next Stack의 가장 마지막으로 보관된 페이지를 가져옴
4. 마지막으로 현재 페이지를 Prev Stack에 보관함

연습문제

import java.util.*;

public class Solution { 
  private ArrayList<Integer> listStack = new ArrayList<Integer>();

  public void push(Integer data) {
      listStack.add(data);
  }

  public Integer pop() {
     if(listStack.size() == 0) {
      return null;
    }else {
      return listStack.remove(listStack.size() -1);
    }
  }

  public int size() {
     return listStack.size();
  }

  public Integer peek() {
     if(listStack.size() == 0) {
      return null;
    }else {
      return listStack.get(listStack.size() - 1);
    }
  }

  public String show() {
    return listStack.toString();
  }
  public void clear() { listStack.clear(); }
}

사용 예시

Solution stack = new Solution();

stack.size(); // 0
for(int i = 1; i < 10; i++) {
  	stack.push(i);
}
stack.pop(); // 9
stack.pop(); // 8
stack.size(); // 7
stack.push(8);
stack.size(); // 8

0개의 댓글