티스토리 뷰

======================================================

안녕하세요 Doridori 입니다. 


지난 강의 까지 열심히 달려왔는데 개인적인 생각으로 강의 내용에 너무 특별한걸 많이 넣으려고 했나? 라는 생각이 들어서 이번 강의는 다시 초심으로 돌아가서 알아보려는 내용에 집중하는 예제를 준비해 보았습니다. 


Queue와 Stack에 대한 내용인데 자료 구조 중에서 자료의 이동이 특이한 편에 속하는 내용이기 때문에 익혀 두시면 도움이 많이 될것 같습니다.

======================================================


자료구조 1 (Queue, Stack)


Source UI) Study_20_Queue_Stack(UI).zip

Soruce 전체) Study_20_Queue_Stack.zip

교재) 20강 자료구조 1 (Queue, Stack).pdf




이번강의의 경우 실질적으로 보면 7강 Array에서 이어지는 내용이라고 보면 될것 같습니다. 


자료구조가 이렇게 뒤로 밀린이유는 기본적으로 Array로 비슷한 기능을 만들수 있기 때문에 이때까지는 배열 관련된 부분들을 대부분 다 Array로 처리하고 넘어갔습니다. 


어쨋든 프로그램의 대부분은 자료들을 가지고 정렬및 가공을 한뒤에 필요한 정보를 찾아서 화면에 보여주는 형식이라고 생각하는편이기 때문에 Queue, Stackc, List, Dictionary, DataTable, DataSet 등의 자료 구조들을 알아 두면 어렵게 구현해야 하는 프로그램도 쉽게 구현이 가능하다고 생각합니다. 


Queue의 경우 터널 형의 자료 구조로 생각 하면 될것 같고 자료의 이동도 선입선출(먼저들어간 Data가 먼저 나가게 됩니다.)의 형태를 따릅니다. 

Queue 같은 경우는 제가 일하는 쪽에서는  뭔가 장애관련 Alarm이 여러곳에서 한번에 발생 했을 경우에 Queue에 순차적으로 넣어 두었다가 1초단위로 순서대로 Alarm 발생 내용을 보고 해주고 있습니다. 


Stack의 경우 동전 지갑 or 탄창 같은 구조로 생각하면 될것 같고 자료의 이동은 후입선출(마지막에 들어간 Data가 먼저 나가게 됩니다.)의 형태를 따릅니다. 

가장 잘 알려진 구현 형태의 경우 Window Program들의 Control + Z (되돌리기) 기능을 생각 하시면 될것 같습니다. 


UI)


이번에는 Layout 형태로 구현하였기 때문에 TableLayoutPanel 이라는 Control을 사용해서 화면을 구현해 보았습니다. 

Winform의 경우 멀티 플렛폼을 구현에 최적화된 UI가 아니기 때문에 화면 크기에 따라 Control을 늘리거나 하려고 하면 별도로 구현해야 하거나 Control 자체가 Dock 해야하는 경우가 많은데 와중에 사이즈를 % 형태로 구현 할 수 있게 도와 주는 Control입니닫. 


잘 사용할 경우 화면 Layout를 구현하는데 많은 도움이 됩니다. 






강의)


시간이 지남에 따라 강의에 뭔가 색다른 예제를 만들어 보려고 고민하다 보니 프로그램이 점점 시간이 많이 걸리게 되는듯 하여 이번강의는 자료 구조 중심으로 필요한 부분만 구현 하는 느낌으로 만들어 보았습니다. (강의 시간을 줄이기 위해서 고민해 보았습니다. ^^)




Source)


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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace _20_Queue_Stack
{
    /// <summary>
    /// Queue와 Stack에 Data를 입,출력 하면서 자료 구조와 Data의 이동을 확인
    /// </summary>
    public partial class Form1 : Form
    {
        Queue<int> _Queue = new Queue<int>(6);  // Queue를 선언 및 초기화
        Stack<int> _Stack = new Stack<int>(6);  // Stack을 선언 및 초기화
 
        /// <summary>
        /// 진입점
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }
 
 
        /// <summary>
        /// 입력을 Click 했을 경우 Queue와 Stack에 같은 Data를 입력
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDataIn_Click(object sender, EventArgs e)
        {
            Random rd = new Random();
            int iData = rd.Next(1101);
 
            //Queue에 Data를 입력
            if (_Queue.Count < 6)
            {
                _Queue.Enqueue(iData);
                fQueueDataDisplay();
            }
 
            //Stack에 Data를 입력
            if (_Stack.Count < 6)
            {
                _Stack.Push(iData);
                fStackDataDisplay();
            }
        }
 
        /// <summary>
        /// 출력을 Click 했을 경우 Queue와 Stack에서 Data를 출력 하면서 자료의 이동을 확인
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDataOut_Click(object sender, EventArgs e)
        {
            fDataOut();
        }
 
        private void fDataOut()
        {
            //Queue에 Data를 입력
            if (_Queue.Count > 0)
            {
                _Queue.Dequeue();
                fQueueDataDisplay();
            }
 
            //Stack에 Data를 입력
            if (_Stack.Count > 0)
            {
                _Stack.Pop();
                fStackDataDisplay();
            }
        }
 
        /// <summary>
        /// Queue의 자료 구조를 화면에 보여줌
        /// </summary>
        private void fQueueDataDisplay()
        {
            int[] iArray = _Queue.ToArray();
 
            Array.Resize(ref iArray, 6);
 
            lblQueue1.Text = (iArray[0== 0) ? "" : iArray[0].ToString();
            lblQueue2.Text = (iArray[1== 0) ? "" : iArray[1].ToString();
            lblQueue3.Text = (iArray[2== 0) ? "" : iArray[2].ToString();
            lblQueue4.Text = (iArray[3== 0) ? "" : iArray[3].ToString();
            lblQueue5.Text = (iArray[4== 0) ? "" : iArray[4].ToString();
            lblQueue6.Text = (iArray[5== 0) ? "" : iArray[5].ToString();
        }
 
        /// <summary>
        /// Stack의 자료 구조를 화면에 보여줌
        /// </summary>
        private void fStackDataDisplay()
        {
            int[] iArray = _Stack.ToArray();
 
            Array.Resize(ref iArray, 6);
 
            lblStack1.Text = (iArray[0== 0) ? "" : iArray[0].ToString();
            lblStack2.Text = (iArray[1== 0) ? "" : iArray[1].ToString();
            lblStack3.Text = (iArray[2== 0) ? "" : iArray[2].ToString();
            lblStack4.Text = (iArray[3== 0) ? "" : iArray[3].ToString();
            lblStack5.Text = (iArray[4== 0) ? "" : iArray[4].ToString();
            lblStack6.Text = (iArray[5== 0) ? "" : iArray[5].ToString();
        }
 
        
 
 
        Timer _oTimer = new Timer();
        bool _bTimer = false;   // Timer 스위치
 
        private void btnAutoDataOut_Click(object sender, EventArgs e)
        {
            if (_bTimer)
            {
                _oTimer.Stop();
 
                _bTimer = false;
            }
            else
            {
                _oTimer.Interval = 2000;
                _oTimer.Tick += _oTimer_Tick;
                _oTimer.Start();
 
                _bTimer = true;
            }
        }
 
        private void _oTimer_Tick(object sender, EventArgs e)
        {
            fDataOut();
        }
    }
}
 
cs




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함