看板 C_and_CPP 關於我們 聯絡資訊
嗨,魯蛇我看到維基百科對於ADT的描述有點不清楚,故上來發文請教。 網址: https://en.wikipedia.org/wiki/Abstract_data_type In computer science, an abstract data type (ADT) is a mathematical model for data types, where a data type is defined by its behavior (semantics) from the point of view of a user of the data, specifically in terms of possible values, possible operations on data of this type, and the behavior of these operations. 我有查過stack overflow關於ADT的定義,讀完之後,想法是: 我定義一個全新的資料型別,這個資料型別的"概念"是可以放很多相同型別變數的容器, 而我要求在C語言中(我只會C,所以拿C當例子),創造這個變數的方式(semantic)是: 容器裡的資料型別 容器名字[容量];,for example: int array[3]; 同時我定義中括號裡面的數字為下標,下標可以代表每個在容器裡面的資料的index,同時 也定義如何對這個容器做operation(把容器當作參數丟到function裡、利用指標操作容器) 那麼,這整個東西叫一個ADT,實作出來的叫CDT(concrete data type),也就是array。 我會問這個問題是因為我不太清楚ADT與物件之間的關係。 我現在想要用C實作一個battery的物件,那我要先定義這個battery要用什麼data type表 示、會有什麼行為,那我感覺ADT非常相似於物件,但又感覺有一些差別。 拿個實際我卡住的例子: typedef enum{ BATTERY_UNLOAD, BATTERY_LOADED, BATTERY_HEALTHY, BATTERY_BROKEN, }BATTERY_STATES; typedef struct{ uint16_t voltage; uint16_t current; uint16_t temperature; BATTERY_STATES battery_state; }BATTERY_OBJECT; 在這個例子中,我定義了battery的語意、也定義了battery的operation(可以被指標處理) ,那這不就等於ADT嗎? 如果我今天改成用queue放資料: typedef struct{ queueNode QueueNode; BATTERY_STATES battery_state; }BATTERY_OBJECT; 那麼,物件就不等於ADT了,因為ADT被包含在物件裡。 那請問,我這篇文章在觀念上哪邊有錯誤嗎? 如果沒有錯誤,那麼,物件與ADT之間的關係是? 謝謝各位前輩指教。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.26.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1520826872.A.20D.html
Ommm5566: ADT其實就是封裝概念一種 使用者不需要知道實際行為 03/12 12:50
Ommm5566: 第一段最後一行就說了 一般的DS是大家知道實作細節的 03/12 12:51
Ommm5566: 比如queue, list, heap 一喊出來你就會知道他的底層是 03/12 12:51
Hazukashiine: 我們一般稱 stack queue 等為 ADT 大概就這樣而已 03/12 12:52
Ommm5566: sequential, reference, tree 03/12 12:52
Hazukashiine: 把ADT 跟物件混在一起討論也是蠻神奇的 03/12 12:52
Ommm5566: 而ADT使用者不需要知道底層實作 只要結果符合說明 03/12 12:52
Ommm5566: 再更具體一點就是list你會預期有next操作相反的heap卻無 03/12 12:54
Ommm5566: 這時候就沒有封裝了 03/12 12:54
Ommm5566: 所以你的code跟ADT完全沒關係 03/12 12:55
Ommm5566: 你貼的網頁下面就有C code阿 03/12 12:57
Ommm5566: 簡單說今天stack可能是用list或用array實作 03/12 12:57
Ommm5566: 使用者不用管 只要這個介面保證stack給我push和pop正確 03/12 12:58
Ommm5566: 當然用stack/quere/list/heap不是很好的例子 03/12 12:59
Ommm5566: 常見的實作就那幾種 很容易讓第一次看到的人無法理解 03/12 13:01
Ommm5566: 封裝的概念 03/12 13:01
flowwinds: ADT定義中寫用此資料型別會如何被使用及操作來定義它, 03/12 13:07
flowwinds: 而不著重此資料型別實際上用什麼方式(陣列或串列)實現 03/12 13:09
MOONRAKER: 學一學資料結構,不要用看的。 03/12 14:11
MOONRAKER: 還有你既然有看到wiki 那就看一下底下Examples裏面有 03/12 14:13
MOONRAKER: 哪一些東東 基本上你就記得要複雜到那樣才會叫ADT 03/12 14:14
不好意思,順便借問一下,Horowitz的fundamentals of data structures第一版(1981)與 第二版(2007)的內容會差很多嗎?我手頭只有第一版 ※ 編輯: zzss2003 (60.248.26.157), 03/12/2018 15:39:39
MOONRAKER: 非常多 我在圖書館借來看過 03/12 15:53
謝啦~那我去買個第二版來讀好了 ※ 編輯: zzss2003 (60.248.26.157), 03/12/2018 16:23:54