본문 바로가기
프로그래밍/자료구조

스택방식 - 선입 후출 - 접시가 쌓여간다.

by 눈야옹 2016. 2. 22.

스택 방식

스택 방식은 접시가 쌓이는 모양에 비유를 많이 한다. 

그렇게 접시를 push해서 쌓고  맨위에 접시를  pop으로 리턴함과 동시에 자료항목에서 삭제한다.

스택의 노드 구조를 다루기 위해 배열로 전환하기도 한다. C#에서는 ToArry 라는 항목이 Stack의 호풀 함수로 가지고 있다.

(배열로 전환후 0번 배열이 가장 나중에 들어온 즉. Pop을 사용시 나오는 데이터이다.

* 예시  : FPS 에서 무기를 교체하게 되는데 이전의 무기가 무엇인지 그리고 그 이전에 또 그 이전에 무기가 무엇인지 기록한다면 좋다.

만약 내가 폭탄을 들고 있다가 다썻다면 바로 이제 내가 들고 있던 이전 무기로 돌아와야 한다. 메인이면 메인 서브면 서브 혹은 권총이면 권총 

 아래 코드에서는 구조체로 스택을 쌓아서 기록 했지만 Map(C# = Dictionary)를 활용 할수도 있겟다.

또 UI 패널 혹은 게시판 들도 이러한 구조로 기록한다면 내가 CurrentPage를 닫고 바로 다음 페이지를 불러올수 있도록 사용할수 잇겠고, 이것에 트리구조를 넣어 준다면 0번에는 항상 최상 혹은 최하값을 가진 데이터가 존재하게 할수 있겟다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public struct ST_WeaponHoldEquipInfo
    {
        public E_WeaponKind _eWeaponKind;
        public E_WeaponSlotKind _eWeaponSlotKind;
    }
 
Dictionary<E_WeaponSlotKind, cPlayerWeaponContolSlot> m_dicSlot = new Dictionary<E_WeaponSlotKind, cPlayerWeaponContolSlot>();
 
    private Stack<ST_WeaponHoldEquipInfo> m_stack_PrevWeapon = new Stack<ST_WeaponHoldEquipInfo>();
 
public ST_WeaponHoldEquipInfo GetLastPrevEquipInfo(bool _isPop = true)
    {
        if(_isPop)
        {
            return m_stack_PrevWeapon.Pop();
        }
        else
        {
            ST_WeaponHoldEquipInfo[] arry = m_stack_PrevWeapon.ToArray();
            return arry[0];
        }
           
    }
 
    public ST_WeaponHoldEquipInfo GetLastMainPrevEquipInfo()
    {
        ST_WeaponHoldEquipInfo[] arry = m_stack_PrevWeapon.ToArray();
        m_stack_PrevWeapon.Clear();
        for (int i = arry.Length -1 ; 0 <= i; --i)
        {
            if (arry[i]._eWeaponKind == E_WeaponKind.E_WeaponKind_Empty)
            { }
            else if (arry[i]._eWeaponKind == E_WeaponKind.E_WeaponKind_Pistol)
            { }
            else if (arry[i]._eWeaponKind == E_WeaponKind.E_WeaponKind_Grenade)
            { }
            else
            {              
                m_stack_PrevWeapon.Push(arry[i]);
            }
        }
        return m_stack_PrevWeapon.Pop();
    }
 
    public void AddLastPrevEquip(ST_WeaponHoldEquipInfo _info)
    {
        ST_WeaponHoldEquipInfo[] arry = m_stack_PrevWeapon.ToArray();
        m_stack_PrevWeapon.Clear();
        for (int i = arry.Length -1 ; 0 <= i  ; --i)
        {
            if(arry[i]._eWeaponKind == _info._eWeaponKind 
                && arry[i]._eWeaponSlotKind == _info._eWeaponSlotKind)
            { }
            else
            {
                m_stack_PrevWeapon.Push(arry[i]);
            }
        }
        m_stack_PrevWeapon.Push(_info);        
    }
cs