본문 바로가기

   
Programming/C#

ArrayList, Queue 구현

반응형

//2012-2-24 받은 문제

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

 

namespace ConsoleEx

{

    class q2_24_al

    {

        //398 모두 다함께 취업합시다!!!!!!

        static void Main(string[] args)

        {

 

 

            UAL a = new UAL();

            Console.WriteLine(a.Count);

            Console.WriteLine(a.Capacity);

            a.Add(10);

            a.TrimToSize();

            a.Add(10);

            a.Add(10);

            Console.WriteLine(a.Count);

            Console.WriteLine(a.Capacity);

            Console.WriteLine("*");

 

            ArrayList b = new ArrayList();

            Console.WriteLine(b.Count);

            Console.WriteLine(b.Capacity);

 

            b.Add(10); b.Add(10); b.Add(10); b.Add(10); b.Add(10);

            Console.WriteLine(b.Count);

            Console.WriteLine(b.Capacity);

            b.RemoveAt(0);

            Console.WriteLine(b.Count);

            Console.WriteLine(b.Capacity);

            b.TrimToSize();

 

            Console.WriteLine(b.Count);

            Console.WriteLine(b.Capacity);

 

        }

    }

 

    //UserArrayList

    class UAL

    {

        private object[] nums;

        public int index;

 

        public UAL()

        {

            this.index = 0;

        }

 

        public void Add(int n)

        {

            if (this.nums == null) nums = new object[4];

            if (this.index == nums.Length)

            {

                object[] temp = new object[nums.Length * 2];

 

                for (int i = 0; i < this.nums.Length; i++)

                {

                    temp[i] = nums[i];

                }

                this.nums = temp;

            }

            this.nums[this.index] = n;

            this.index++;

        }

 

        public int Count

        {

            get { return index; }

        }

 

        public int Capacity

        {

            get

            {

                if (this.nums == null) return 0;

                return this.nums.Length;

            }

            set

            {

                object[] temp = new object[value];

                for (int i = 0; i < this.index; i++)

                    temp[i] = this.nums[i];

                this.nums = temp;

            }

        }

 

        public object this[int n]

        {

            set

            {

                int a = (int)this.nums[n] + 1;

                this.nums[n] = value;

            }

            get

            {

                int a = (int)this.nums[n] + 1;

                return this.nums[n];

            }

        }

 

        public void Remove(int n)

        {

            for (int i = 0; i < index; i++)

                if ((int)this.nums[i] == n)

                {

                    n = i; index--;

                    for (; n < this.nums.Length - 1; n++)

                        this.nums[n] = this.nums[n + 1];

                    this.nums[n] = null;

                    break;

                }

        }

        public void RemoveAt(int n)

        {

            int a = (int)this.nums[n] + 1;

            index--;

            for (; n < this.nums.Length - 1; n++)

                this.nums[n] = this.nums[n + 1];

            this.nums[n] = null;

        }

 

        public void Insert(int n, object value)

        {

            int a = (int)this.nums[n] + 1;

            this.index++;

            if (index >= this.nums.Length)

            {

                object[] temp = new object[nums.Length * 2];

                for (int i = 0; i < this.nums.Length; i++)

                    temp[i] = nums[i];

                this.nums = temp;

            }

            for (int i = this.index - 1; i > n; i--)

                this.nums[i] = this.nums[i - 1];

            this.nums[n] = value;

        }

        public void TrimToSize()

        {

            object[] temp = new object[this.index];

            for (int i = 0; i < this.index; i++)

                temp[i] = nums[i];

            this.nums = temp;

        }

    }

}

 

 


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Homework

{

    //UserQueue.cs

    class UserQueue

    {

        //UserQueue에서 사용할 핵심 배열 멤버변수

        private int[] UserQueueArray;

        //입력시 배열의 맨마지막 칸에 넣기위해 사용하는 멤버변수

        private int idxNumber;

 

        //생성자

        public UserQueue()

        {

            //따로 입력값없이 인스턴스생성시 배열은0크기부터 시작

            this.UserQueueArray = new int[0];

            this.idxNumber = 0;

        }

        //생성자를 int파라메터가 있는형태로 오버로드

        // int파라메터는 실제 배열의 크기를 셋팅

        public UserQueue(int setlength)

        {

            //따로 입력값이 있을땐 수치만큼 인스턴스생성

            this.UserQueueArray = new int[setlength];

            this.idxNumber = 0;

        }

 

        //#1 갯수세는 프로퍼티,읽기전용

        public int Count

        {

            get

            {

                //실제데이터의 갯수를 세는 변수 생성

                int realdata = 0;

                //배열 모든 조사해서 0 아닌 값의 갯수를 센다.

                foreach (int item in this.UserQueueArray)

                {

                    if (item != 0)

                    {

                        realdata++;

                    }

                }

                //실제 값이 몇갠지 반환

                return realdata;

            }

        }

 

        //#2 현재 진짜 배열의 최대 Length값을 반환하는 프로퍼티

        public int Capacity

        {

            get

            {

                return this.UserQueueArray.Length;

            }

        }

 

        //#3 입력 Enqueue메서드

        public void Enqueue(int data)

        {

            //입력값을 0으로 했을땐 무시함.

            if (data != 0 && data < 210000000)

            {

                //최초 데이터가 들어가지 않았는데 인덱서 이용해서 넣으려고

                //시도를 할때, 에러가나도록 .

                //Enqueue 먼저 데이터를넣어야만 한다.

 

                //최초 데이터를 넣을때 0개짜리 배열 버리고

                //기본 4개짜리 배열을 생성한다.

                if (this.UserQueueArray.Length == 0 &&

                    idxNumber == this.UserQueueArray.Length)

                {

                    int[] temp = new int[4];

                    this.UserQueueArray = temp;

                }

 

                //기본 4개짜리 배열이 찼을경우

                //다섯번째 데이터를 넣으려 할때 배열을 두배수 크기로 바꿔준다.

                else if (idxNumber == this.UserQueueArray.Length)

                {

                    //기존크기보다 두배 크기의 배열 생성

                    int[] temp = new int[this.UserQueueArray.Length * 2];

 

                    //기존 배열에 담긴 기존 입력값을 새로만든 배열로 이동

                    for (int i = 0; i < this.UserQueueArray.Length; i++)

                    {

                        temp[i] = this.UserQueueArray[i];

                    }

                    //기존 배열의 변수에 새로만든 배열의 주소값 적용

                    this.UserQueueArray = temp;

                }

                //data변수이름으로 새로 입력받은 값을 배열의 마지막에 입력

                this.UserQueueArray[this.idxNumber] = data;

                this.idxNumber++;

            }

        }

 

        //#4 출력 Dequeue메서드

        public int Dequeue()

        {

            //출력을위해 dequeue변수에 첫번째방의 값을 넣는다.

            int dequeue = this.UserQueueArray[0];

            //맨앞 데이터를 제외하고 한칸씩 데이터를 앞으로 쉬프트한다.

            //□■■■

            //■■■□

            int[] temp = new int[this.UserQueueArray.Length];

            for (int i = 0; i < this.UserQueueArray.Length; i++)

            {

                if (i != this.UserQueueArray.Length - 1)

                    temp[i] = this.UserQueueArray[i + 1];

            }

 

            //기존 배열변수에 데이터를 한칸씩 앞으로 땡긴 배열을 적용

            this.UserQueueArray = temp;

            this.idxNumber--;

            return dequeue;

        }

 

        //Dequeue했을때 나오는 다음수를 보여주기만

        //#5 Peek 메서드

        public int Peek()

        {

            return this.UserQueueArray[0];

        }

        //#6 TrimToSize 메서드

        public void TrimToSize()

        {

            int trimmedsize = 0;

            for (int i = 0; i < this.UserQueueArray.Length; i++)

            {

                if (this.UserQueueArray[i] != 0)

                    trimmedsize++;

            }

            //배열내에 0이아닌 값의 갯수를 구해서

            // 갯수로 새로 배열을 하나 만들어준다.

            int[] temp = new int[trimmedsize];

 

            //기존 배열의 데이터를 새로만든 배열로 옮김

            for (int i = 0; i < trimmedsize; i++)

            {

                temp[i] = this.UserQueueArray[i];

            }

 

            //기존 배열 변수에 새로만든 배열 적용

            this.UserQueueArray = temp;

        }

        //#7 인덱서....

        public int this[int indexer]

        {

            set

            {

                if (value != 0 && value < 210000000)

                    this.UserQueueArray[indexer] = value;

            }

            get

            {

                return this.UserQueueArray[indexer];

            }

        }

    }

}




Admin

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

 

namespace Homework

{

    //MainMethod.cs

    class MainMethod

    {

        static void Main(string[] args)

        {

            //Test

            ArrayList list = new ArrayList();

            list.Add(10);

            list.Add(20);

            list.Add(30);

            list.Add(40);

            list.Add(50);

 

            Console.WriteLine(list.Capacity);

 

            while (true)

            {

                Console.WriteLine();

                Console.WriteLine("".PadLeft(57, '+'));

                Console.WriteLine();

                Console.Write("".PadLeft(21, '+'));

                Console.Write("   Q U E U E   ");

                Console.WriteLine("".PadLeft(21, '+'));

                Console.WriteLine("Queue : FIFO방식의 파이프형 배열");

                Console.WriteLine("".PadLeft(57, '+'));

                Console.WriteLine("".PadLeft(57, '+'));

                Console.Write("\t1번시연, 2번시연 선택. (3 종료) : ");

                string Input = Console.ReadLine();

                if (Input == "1")

                {

                    Siyon1();

                }

                else if (Input == "2")

                {

                    Siyon2();

                }

                else if (Input == "3")

                {

                    break;

                }

                Console.Clear();

            }

 

        }

 

        private static void Siyon2()

        {

            Console.WriteLine();

            Console.WriteLine("\t2 시연~ 생성자.");

            Console.WriteLine();

            Console.WriteLine("\tUserQueue test = new UserQueue();");

            UserQueue test = new UserQueue();

            Console.ReadLine();

            Console.WriteLine("\ttest.Capacity");

            Console.WriteLine("\t배열크기 : {0}", test.Capacity); // 최초배열크기는0

            Console.ReadLine();

            Console.WriteLine("\tUserQueue test2 = new UserQueue(200);");

            UserQueue test2 = new UserQueue(200);

            Console.ReadLine();

            Console.WriteLine("\ttest2.Capacity");

            Console.WriteLine("\t배열크기 : {0}", test2.Capacity); // 최초배열크기는0

            Console.ReadLine();

            Console.WriteLine("\tfor (int i = 0; i < test2.Capacity; i++)");

            Console.WriteLine("\t{ test2[i] = i; }");

            for (int i = 0; i < test2.Capacity; i++)

            {

                test2[i] = i;

            }

            Console.ReadLine();

            Console.WriteLine("\ttest2.Dequeue();");

            Console.WriteLine("\t출력 : {0}", test2.Dequeue()); // 디큐로 뽑아냄

            Console.ReadLine();

            Console.WriteLine("\ttest2.Dequeue();");

            Console.WriteLine("\t출력 : {0}", test2.Dequeue()); // 디큐로 뽑아냄0

            Console.ReadLine();

            Console.WriteLine("\ttest2.Dequeue();");

            Console.WriteLine("\t출력 : {0}", test2.Dequeue()); // 디큐로 뽑아냄1

            Console.ReadLine();

            Console.WriteLine("\ttest2.Dequeue();");

            Console.WriteLine("\t출력 : {0}", test2.Dequeue()); // 디큐로 뽑아냄2

            Console.ReadLine();

            Console.WriteLine("\ttest2.Dequeue();");

            Console.WriteLine("\t출력 : {0}", test2.Dequeue()); // 디큐로 뽑아냄3

            Console.ReadLine();

            Console.WriteLine("\ttest2.Dequeue();");

            Console.WriteLine("\t출력 : {0}", test2.Dequeue()); // 디큐로 뽑아냄4

            Console.ReadLine();

            Console.WriteLine("\ttest2.Count;");

            Console.WriteLine("\t출력 : {0}", test2.Count); // 데이터갯수확인하면 194나옴

            Console.ReadLine();

        }

 

        private static void Siyon1()

        {

            Console.WriteLine();

            Console.WriteLine("\t1 시연~ 기능들.");

            Console.WriteLine();

            Console.WriteLine("\tUserQueue test = new UserQueue();");

            UserQueue test = new UserQueue();

            Console.ReadLine();

            Console.WriteLine("\ttest.Capacity");

            Console.WriteLine("\t배열크기 : {0}", test.Capacity); // 최초배열크기는0

            Console.ReadLine();

            Console.WriteLine("\ttest.Enqueue(10);");// 10넣고

            test.Enqueue(10);

            Console.ReadLine();

            Console.WriteLine("\ttest.Capacity");

            Console.WriteLine("\t배열크기 : {0}", test.Capacity);// 데이터하나만있어도 최초배열은 4

            Console.ReadLine();

            Console.WriteLine("\ttest.Enqueue(20);");// 20넣고

            test.Enqueue(20); // 20넣고

            Console.WriteLine("\ttest.Enqueue(30);");// 30넣고

            test.Enqueue(30); // 30넣고

            Console.ReadLine();

            Console.WriteLine("\ttest.TrimToSize();");// 데이터 있는만큼의 크기로 배열을 잘라냄(?)

            test.TrimToSize(); // 데이터 있는만큼의 크기로 배열을 잘라냄(?)

            Console.WriteLine("\t배열크기 : {0}", test.Capacity);// 배열크기가 3으로 바뀜

            Console.ReadLine();

            Console.WriteLine("\ttest.Enqueue(40);");// 40넣고

            test.Enqueue(40); // 40넣고

            Console.WriteLine("\ttest.Capacity"); //배열크기가 2배수인 6으로바뀜

            Console.WriteLine("\t배열크기 : {0}", test.Capacity);// 배열크기가 3으로 바뀜

            Console.ReadLine();

            Console.WriteLine("\ttest.Peek();");

            Console.WriteLine("\t출력 : {0}", test.Peek()); // 최초에넣은 10이나옴

            Console.ReadLine();

            Console.WriteLine("\ttest.Peek();");

            Console.WriteLine("\t출력 : {0}", test.Peek()); // 또해봐도 최초에넣은 10이나옴

            Console.ReadLine();

            Console.WriteLine("\ttest.Dequeue();");

            Console.WriteLine("\t출력 : {0}", test.Dequeue()); // 디큐로 뽑아냄10

            Console.ReadLine();

            Console.WriteLine("\ttest.Peek();");

            Console.WriteLine("\t출력 : {0}", test.Peek()); // 확인하면 다음나올 20이나옴

            Console.ReadLine();

            Console.WriteLine("\ttest[0] = 100;"); // 0번방을 100으로 수정

            test[0] = 100;

            Console.WriteLine("\ttest.Peek();");

            Console.WriteLine("\t출력 : {0}", test.Peek()); // 확인하면 100이나옴

            Console.ReadLine();

            Console.WriteLine("\ttest.Count;");

            Console.WriteLine("\t출력 : {0}", test.Count); // 데이터갯수확인하면 3이나옴

            Console.ReadLine();

            Console.WriteLine("\ttest[0],test[1],test[2],test[3] ;");

            Console.WriteLine("\t출력 : {0}, {1}, {2}, {3}", test[0], test[1], test[2], test[3]); // 확인하면 100 30 40 0이나옴

            Console.ReadLine();

        }

    }

}


 


반응형