Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

TMI개발일기

스택(stack) 본문

백엔드/Java

스택(stack)

JP59 2021. 3. 15. 12:20

 

스택에 대해 알아보자.

 

게임을 좋아하는 사람이라면 의미는 잘 모르지만 

'스택을 쌓다'라는 말을 들어봤거나 해본적이 있을 것이다.

LOL(리그오브레전드)를 예로 들어보자.

 

메자이는 킬이나 어시를 갱신할 때마다 능력치가 올라간다.

나서스 스킬 q는 미니언 막타를 칠 때마다 능력치가 올라간다.

두 능력의 공통점은 뭘까?

일정 조건을 만족하면 능력치가 쌓인다. 쌓인 능력치는

챔피언을 공격할 때 가장 마지막에 쌓였던 능력치만큼 데미지를 더해준다.

게임을 잘 모르는 사람을 위해 창고를 예시로 하나 더 들어보자.

 

우리가 창고에 물건을 적재할 때 적재 순서를 효율적을 짤 수 있을까?
꺼내는 빈도가 적은 물건은 안쪽 깊숙히, 잦은 물건은 문과 가까운 바깥쪽에
적재할 것이다. 안쪽에 쌓인 물건을 꺼내기보단 문앞에, 바깥쪽에 쌓인 물건을 꺼내기

쉽지 않은가? 

 

스택의 구조는 입구가 하나인 바구니와 같다.

먼저 넣은 데이터가 아래에 쌓이고 가장 나중에 넣은 데이터가 위쪽에 쌓이는 구조로
웹 페이지에서는 뒤로가기 앞으로가기 메뉴에서 자주 쓰이는 방식이다.

이를 LIFO(last in first out)이라 하는데 이게 스택의 전부라 해도 무방하다.

 

마지막 데이터
4번째 데이터
3번째 데이터
2번째 데이터
1번째 데이터

넣고 빼는 통로가 한개밖에 없으므로 빼낼 때는 가장 마지막에 넣은 데이터가 표시된다.

 

stack은 util.stack을 import해서 사용해야 하는데

java는 stack을 쉽게 사용할 수 있도록 함수를 마련해놨다.

 

코드로 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Stack;
 
 
public class stack {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        Stack<Integer> a = new Stack<Integer>();
        
        
        for(int i=0;i<100;i++) {
            
            int push= i+1;
            a.push(push);//stack에 데이터 적재
            
        }
        
        System.out.println(a.peek()); //stack제일 꼭대기 데이터 호출
        System.out.println(a.empty());//stack이 비어있으면 true 아니면 false
        
        a.pop();// stack 제일 꼭대기 데이터 삭제
        System.out.println(a.peek());    
    
        System.out.println(a.search(1));
        System.out.println(a.search(99));
    }
 
}
cs

 

 

객체를 생성할때 전에 알아봤던 2021.03.10 - [개발 노트] - ArrayList

 

ArrayList

ArrayList는 list 인터페이스를 상속받은 가변형 선형리스트다. 비슷한 모양으로 배열(Array)가 있는데 배열과 차이점은 개발자가 배열공간을 선언해두고 데이터를 넣어야 해서 데이터 수가 늘어났

tmidiary.tistory.com

를 할때처럼 <>안에 데이터 타입을 선언해준다.

stack에서는 데이터를 넣을 때 push명령어를 쓴다. 위 코드에서는 for문으로 1~100까지의 정수를 stack a에 넣었다.

 

가장 위에 있는(가장 나중에 들어온 데이터)를 호출하고 싶을 땐 peek명령어를 쓴다.

만약 stack의 데이터가 비었는지 채워졌는지 boolean값으로 받고 싶으면 empty를 사용한다.

 

가장 위의 데이터를 지우고 싶으면 pop을 쓴다.

 

만약 stack에서 특정 데이터값의 index를 참조하고 싶으면 search를 사용하면 된다. 

'백엔드 > Java' 카테고리의 다른 글

hash란  (0) 2021.03.21
콜렉션과 Set 클래스  (0) 2021.03.16
이클립스 단축키  (0) 2021.03.15
디버그(Debug)에 관해.....  (0) 2021.03.12
선택정렬(select sort)  (0) 2021.03.12