簡單數據結構類
文章目錄
- 1、Arraylist
- 1、ArrayList的本質
- 2、聲明
- 3、增刪查改
- 4、裝箱拆箱
- 思考 背包售賣
- 2、Stack
- 1、Stack的本質
- 2、聲明
- 3、增取查改
- 4、遍歷
- 思考 計算一個數的二進制
- 3、Queue
- 1、Queue的本質
- 2、聲明
- 3、增取查改
- 4、遍歷
- 思考 每隔一段時間打印一條消息
- 4、Hashtable
- 1、Hashtable本質
- 2、聲明
- 3、增刪查改
- 4、遍歷
- 思考 單例制造怪物工廠
1、Arraylist
1、ArrayList的本質
ArrayLists是一個C#為封裝好的類
它的本質是一個Object類型的數組
2、聲明
using System.Collections;
ArrayList array = new ArrayList();
3、增刪查改
增
array.Add(1);
ArrayList array2 = new ArrayList();
array2.Add(true);
//批量增加
array.AddRange(array2);array.Insert(1,"222");
刪
移除指定元素array.Remove(1);
移除指定位置的元素array.RemoveAt(2);
清空array.Clear();
查
得到指定的元素array[0];
查看元素是否存在if(array.Contains("1")){Console.WriteLine("存在");}
正向查找元素位置找到的返回值是位置,沒找到返回-1int index = array.IndexOf(true);Console.WriteLine(index);反向查找元素位置int index = array.LastIndexOf(true);Console.WriteLine(index);
改
array[0] = "666";
Console.WriteLine(array[0]);
遍歷
長度Console.WriteLine(array.Count);
容量Console.WriteLine(array.Capacity);
遍歷for(int i = 0; i < array.Count; i++){Console.WriteLine(array[i]);}
迭代器遍歷foreach (object item in arrayList){Console.WriteLine(item);}
4、裝箱拆箱
ArrayList本質是一個可以自動擴容的object數組
存儲值類型裝箱,將值類型取出來拆箱int i = 1;array[0] = i; //裝箱i = (int)array[0]; //拆箱
思考 背包售賣
//創建一個背包管理類,使用ArrayList存儲物品
//實現購買物品,賣出物品,顯示物品的功能;購買與賣出會導致金錢的變化
BagMgr bag = new BagMgr(9999);
Item i1 = new Item(1,9,"藥",5);
Item i2 = new Item(2,99,"書",3);
Item i3 = new Item(3,999,"刀",1);
bag.BuyItem(i1);
bag.BuyItem(i2);
bag.BuyItem(i3);bag.SellItem(i3);
bag.SellItem(1,1);
bag.SellItem(2,1);
class BagMgr
{private ArrayList items;private int money;public BagMgr(int money){this.money = money;items = new ArrayList();}public void BuyItem(Item item){if (item.num <= 0 || item.money < 0){Console.WriteLine("錯誤物品或金錢");return;}if (money < item.money * item.num){Console.WriteLine("錢不夠");return;}money -= item.money * item.num;Console.WriteLine("購買{0}{1}個,花費{2}錢,余額{3}", item.name,item.num,item.money*item.num,money);for (int i = 0; i < items.Count;i++){if ((items[i] as Item).id == item.id){(items[i] as Item).num += item.num;return;}}items.Add(item);}public void SellItem(Item item){for (int i = 0; i < items.Count; i++){if ((items[i] as Item).id == item.id){int num = 0;string name = (items[i] as Item).name;int money = (items[i] as Item).money;if ((items[i] as Item).num > item.num){num = item.num;}else{num = (items[i] as Item).num;items.RemoveAt(i);}int sellMoney = money* num;this.money += sellMoney;Console.WriteLine("賣了{0}{1}個,賺了{2},余額{3}", name, num, sellMoney, this.money);return;}}}public void SellItem(int id, int num = 1){Item item = new Item(id,num);SellItem(item);}public void ShowItem(){Item item;for (int i = 0; i < items.Count; i++){item = items[i] as Item;Console.WriteLine("有{0}{1}個", item.name, item.num);}Console.WriteLine("余額{0}",money);}
}
class Item
{public int id;public int money;public string name;public int num;public Item(int id, int num){this.id = id;this.num = num;}public Item(int id, int money, string name, int num){this.id = id;this.money = money;this.name = name;this.num = num;}
}
2、Stack
1、Stack的本質
Stack 是一個C#為我們封裝好的類
它的本質是Object[]數組
Stack是棧存儲容器,棧是一種先進后出的數據結構
2、聲明
Stack stack = new Stack();
3、增取查改
增 //壓棧stack.Push(1);stack.Push("123");stack.Push(true);取 //彈棧//棧中不存在刪除的概念,只有取的概念object v1 = stack.Pop();Console.WriteLine(v1);v1 = stack.Pop();Console.WriteLine(v1);查//棧無法查看指定位置的元素,只能查看棧頂的內容v1 = stack.Peek();Console.WriteLine(v1);//2、查看元素是否存在于棧中if (stack.Contains("123")){Console.WriteLine("存在123");}改//棧無法改變其中的元素,只能存和取,有清空方法stack.Clear();
4、遍歷
1、長度Console.WriteLine(stack.Count);2、用foreack遍歷//遍歷出來的順序從頂到低foreach(object item in stack){Console.WriteLine(item);}3、將棧轉換為object數組//遍歷出來的順序從頂到低object[] array = stack.ToArray();for (int i = 0; i < array.Length; i++){Console.WriteLine(array[i]);}4、循環彈棧while (stack.Count > 0){object item = stack.Pop();Console.WriteLine(item);}
思考 計算一個數的二進制
//寫一個方法計算任意一個數的二進制
//使用棧結構方式存儲,之后打印處理
Calc(10);
static void Calc(uint num)
{Stack stack = new Stack();while (true){stack.Push(num % 2);num /= 2;if (num == 1 || num ==0){stack.Push(num);break;}}while(stack.Count > 0){Console.Write(stack.Pop());}
}
3、Queue
1、Queue的本質
Stack 是一個C#為我們封裝好的類
它的本質是Object[]數組
Queue是隊列存儲容器
隊列是一種先進先出的數據結構
2、聲明
Queue queue = new Queue();
3、增取查改
增Queue queue = new Queue();queue.Enqueue(1);queue.Enqueue("123");queue.Enqueue(1.3f);
取 取出先進入的對象object v = queue.Dequeue();Console.WriteLine(v);
查1、查看隊列頭部元素但不會移除v = queue.Peek();2、查看元素是否存在于隊列中if (queue.Contains(1.3f){Console.WriteLine("存在");}
改queue.Clear();
4、遍歷
1、長度Console.WriteLine(queue.Count);
2、用foreach遍歷foreach (object o in queue){Console.WriteLine(o);}
3、轉換為數組forobject[] array = queue.ToArray();for (int i = 0; i < array.Length; i++){Console.WriteLine(array[i]);}
4、循環出列while (queue.Count > 0){object o = queue.Dequeue();Console.WriteLine(o);}
思考 每隔一段時間打印一條消息
//使用隊列存儲消息,一次性存10條消息,每隔一段時間打印一條消息
//控制臺打印消息時要有明顯頓挫感
Queue queue = new Queue();
queue.Enqueue("獲得44金幣");
queue.Enqueue("獲得裝備");
queue.Enqueue("獲得藥草");
queue.Enqueue("獲得經驗");
queue.Enqueue("獲得秘籍");
queue.Enqueue("獲得頂級秘笈");queue.Enqueue("獲得裝備");
queue.Enqueue("獲得藥草");
queue.Enqueue("獲得經驗");
queue.Enqueue("獲得秘籍");
queue.Enqueue("獲得無上心法");int updateIndex = 1;
while (queue.Count > 0)
{if (updateIndex % 77777777 == 0){if (queue.Count > 0){Console.WriteLine(queue.Dequeue());}updateIndex = 0;}updateIndex++;
}
4、Hashtable
1、Hashtable本質
Hashtable(散列表)是基于鍵的哈希代碼組織起來的鍵值對
它的主要作用是提高數據查詢的效率
使用鍵來訪問集合中的元素
2、聲明
Hashtable hashtable = new Hashtable();
3、增刪查改
增 //不能出現相同的鍵hashtable.Add(1,"234");hashtable.Add(2,"255");
刪//1、只能通過鍵去刪除hashtable.Remove(2);//刪除不存在的鍵,沒反應//2、直接清空hashtable.Clear();
查//1、通過鍵查看值,找不到返回空Console.WriteLine(hashtable[1]);//2、查看書否存在//根據鍵檢測if (hashtable.Contains(1)){Console.WriteLine("存在");}if (hashtable.ContainsKey(2)){Console.WriteLine("存在");}
//根據值檢測if (hashtable.ContainsValue("255")){Console.WriteLine("存在");}改
//只能改鍵對應的值內容,無法改鍵hashtable[1] = false;
4、遍歷
得到鍵值對 對數Console.WriteLine(hashtable.Count);
1、遍歷所有鍵foreach (Hashtable ht in hashtable.Keys){Console.WriteLine("鍵" + ht);Console.WriteLine("值" + hashtable[ht]);}
2、遍歷所有值foreach (Hashtable ht in hashtable.Values){Console.WriteLine("值" + ht);}
3、鍵值對一起遍歷foreach(DictionaryEntry item in hashtable){Console.WriteLine("鍵" + item.Key + "值" + item.Value);}
4、迭代器遍歷IDictionaryEnumerator myEnumerator = hashtable.GetEnumerator();bool flag = myEnumerator.MoveNext();while (flag){Console.WriteLine("鍵" + myEnumerator.Key + "值" + myEnumerator.Value);flag = myEnumerator.MoveNext();}
思考 單例制造怪物工廠
//制作一個怪物類管理器,提供創建怪物
//移除怪物的方法,每個怪物都有自己的唯一id
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.RemoveMonster(0);
MonsterMgr.Instance.RemoveMonster(5);
class MonsterMgr
{ private static MonsterMgr instance = new MonsterMgr();private Hashtable monstersTable = new Hashtable();private MonsterMgr() { }public static MonsterMgr Instance{get{return instance;}}private int monsterID = 0;public void AddMonster(){Monster monster = new Monster(monsterID);Console.WriteLine("創建了id為{0}怪物", monsterID);monsterID++;monstersTable.Add(monster.id, monster);}public void RemoveMonster(int monsterID) { if(monstersTable.ContainsKey(monsterID)){(monstersTable[monsterID] as Monster).Dead();monstersTable.Remove(monsterID);}}
}
class Monster
{public int id;public Monster(int id){this.id = id;}public void Dead(){Console.WriteLine("怪物{0}死亡",id);}
}