Wanna be Brilliant Full-Stack Developer

C# WINFORMS 자료구조1 Queue, Stack 본문

Some Memos/C#

C# WINFORMS 자료구조1 Queue, Stack

Flashpacker 2023. 4. 25. 14:31

Queue같은 경우는 파이프 형태로 먼저 들어간 Data가 먼저 나간다.

Stack같은 경우에는 예재로 많이 나오는 것이 동전 저장 해놓는 장난감 아는가?

동전 하나를 넣으면 밑으로 내려가고 , BB탄 탄창 같은거를 총알을 넣으면 내일 나중에 넣은것이 가장 먼저 나오게 될것이다. 

 

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

 

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

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

 

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

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

 

 

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(1, 101);

            //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();
        }
    }
}