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