iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

C# 從入門到WebApi系列 第 6

[Day6] 今晚我想來點基礎的資料結構

  • 分享至 

  • twitterImage
  •  

前話

其實前幾章大致上已經把一些比較基礎的C#語法講的差不多了
雖然回頭去看發現還是很多地方可以補充或是沒有沒有提到的
之後有空我再回去補充(雖然我常常沒空 ╮(╯_╰)╭)
或是有不懂想補充的都可問問

今天我們來談談幾個比較常用的資料結構

今天主要會介紹3種資料結構
分別是

  • Stack(堆疊)
  • Queue(佇列)
  • Dictionary(字典)

他們都是引用命名空間 System.Collections
記得在你的類別引用

using System.Collections;

Stack

Stack 是一種後進先出(LIFO)(Last In Fisrt Out)的資料結構
我們在[Day4] 我知道Class 班級對吧有稍微提過他
那時候我們用置物櫃來形容Stack
事實上她更像是一個桶子
越早塞進桶子的資料會越晚被取出來
我將

Hi I'm a Stack
分單字放入Stack 內
取出時變成 Stack a I'm Hi

讓我用醜醜的圖示意
1234為放入Stack
5678為從Stack取出(實際上資料取出就不會再放在裡面了,只是我不知道怎麼畫比較好)
https://ithelp.ithome.com.tw/upload/images/20200906/201095493GILaa5m1U.png

那我們如何來建立一個Stack呢
Stack 變數名稱 = new Stack();

Stack MyStack = new Stack();

使用
Push()將元素放入Stack
Pop()將元素取出(一次只能取一個)
Peek()將頂端的元素取出但是不從Stack移除他
Count屬性 取得Stack 的元素個數

Stack MyStack = new Stack();

Console.WriteLine(MyStack.Count);//0
MyStack.Push("Hi");
Console.WriteLine(MyStack.Count);//1
Console.WriteLine(MyStack.Peek());//Hi
Console.WriteLine(MyStack.Count);//1
Console.WriteLine(MyStack.Pop());//Hi
Console.WriteLine(MyStack.Count);//0

Queue

Queue 是一種先進先出(FIFO)(First In Fisrt Out)的資料結構
可以把它想像成排隊買口罩的人潮
先到的人可以先買
買完之後他就從隊伍移除
後到的人排在隊伍的尾端
同樣的我將

Hi I'm a Queue
分單字放入Queue 內
取出時一樣是 Hi I'm a Queue

一樣來張醜醜的圖
1234為放入Queue
5678為從Queue取出(實際上資料取出就不會再放在裡面了,只是我不知道怎麼畫比較好)
https://ithelp.ithome.com.tw/upload/images/20200906/20109549awyrG6lJLS.png

一樣來建一個Queue
Queue 變數名稱 = new Queue();

Queue MyQueue = new Queue();

Queue跟Stack一樣有一些方法和屬性讓我們操作

Enqueue()將元素放入Queue
Dequeue()將元素取出(一次只能取一個)
Peek()將頂端的元素取出但是不從Queue移除他
Count屬性 取得Queue的元素個數

Queue MyQueue = new Queue();
MyQueue.Enqueue("Hi");
MyQueue.Enqueue("I'm");
MyQueue.Enqueue("金城武");

for(int i = 0; i < MyQueue.Count; i++){
    Console.WriteLine(MyQueue.Dequeue);
}

//Hi
//I'm
//金城武

Boxing與UnBoxing 與 泛型集合(重要)

Stack() 與 Queue 中存放的資料是object類型的
還記得我們提過在C#的世界裡
所有東西都是object
也意味著Stack和Queue能存放所有類型的資料
但是 混用資料類型容易出錯
因為取出來的資料也是object類型
所以若是你想要使用他
就必須轉型成你原始的資料
這個過程稱為UnBoxing
在將物品轉成object稱為Box
這之間的轉換是有效能成本的
而且也容易搞混資料類型
有興趣能看(https://github.com/dotnet/platform-compat/blob/master/docs/DE0006.md)

boxing 與 unboxing

所以推薦使用Stack<T>() 與Queue<T>()
其中T就是你想放進Queue裡的資料類型(跟前幾篇講的List一樣)
他們的命名空間為System.Collections.Generic

using System.Collections.Generic

方法和屬性都一樣
只是限制了Queue 和 Stack 內可以放的東西

Queue<string> StringQueue = new Queue<string>();
StringQueue.Enqueue(123);//error
StringQueue.Enqueue("HI");

Dictionary<TKey,TValue>

顧名思義就是字典
他是一種1對1的關係
(其實是可列舉的KeyValuePair 這邊不詳談)
一個Key對上一個Value
常用在班級學號對應等等

我們直接看例子吧

Dictionary<int,string> myDictionary = new Dictionary<int,string>(); 
//宣告一個Dictionary Key 的型態是int 對應到的value型態是string

myDictionary.Add(1,"王小明");
//在字典裡加入一筆資料 key為1 value為王小明
myDictionary.Add(2, "張曉莉");
//在字典裡加入一筆資料 key為2 value為張曉莉

Console.WriteLine(myDictionary[2]);//張曉莉 
//這邊的中括弧[]裡的2與陣列索引的2不同
//指的是key的2

bool isExistKey = myDictionary.ContainKey(3);flase
//用ContainKey來確認字典裡是否存在該筆key
bool isExistValue = myDictionary.ContainValue("王小明");true
//用ContainKey來確認字典裡是否存在該筆value

Console.WriteLine(myDictionary.Count);//2
////用Count來取得字典裡的元素個數

看了這麼多都想睡了 來點腦力激盪吧

這是一個關於括號的故事
左括號和右括號分別是飢渴很久的男女
它們只要找到對應的另一伴就能夠順利地結合
但是右括號比較害羞
一定要由左括號來發起進攻
否則他們之間會無法好好恩愛
今天聯誼公司與辦了一場聯誼
有著許多左右括號來參與
他們依進場順序拿到號碼牌當有對應的CP就能離開去...
今天聯誼公司希望這場聯誼能夠順利配對所有括號
也就是不能有剩下的括弧或不主動的左括弧

以上幹話

()()() 合法 1對2 3對4 5對6
((())) 合法 3對4 2對5 1對6
()(()) 合法 1對2 4對5 3對6
((()) 不合法 3對4 2對5 但是1沒人要 跟我一樣
())(() 不合法 1對2 5對6 但是34為)(

總之就是給定一串隨機括號()()(()()))(()
判斷括號是否合法(聯誼是否成功)

input: string
output: bool

提示: 使用Stack
答案在(https://github.com/peace920902/Parentheses )


上一篇
[Day5] try and error 修正錯誤前進吧!
下一篇
[Day7] 豪想要一種能接納所有人的型別 關於多載與泛型
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言