資料結構使用 Java
description
Transcript of 資料結構使用 Java
資料結構使用 Java第 4 章 Java 程式複習、 ADT 與串列
1
課程內容•複習 -Java 程式設計
▫類別物件▫建構元
•資料結構▫抽象資料型態 ADT▫串列 – 陣列的應用實例
2
類別與物件類別的內容定義類別建立新物件存取物件內容
3
資料成員、成員函數與封裝• 「類別」就是把事物的資料與相關功能「封裝」
( encapsulate )在一起 ▫ 「 encapsulate 」的原意是「將 ... 裝入膠囊內」
• 類別可看成是「膠囊」▫ 資料成員與成員函數可看成是被裝入的東西
4
類別是由「資料成員」與「成員函數」封裝而成
矩型類別的認識5
矩型類別: 資料成員為 width 與 height
成員函數為 area() 與 perimeter()
類別的定義6
類別定義的語法如下:
class 類別名稱 { 資料型態 field 名稱 ; ...
傳回值的資料型態 method 名稱 ( 引數 1, 引數 2,...) { 程式敘述 ; return 運算式 ; } ... }
類別的定義格式
宣告 field
method 的本體 (body)
定義 method 的內容
矩形類別的範例• 以矩形為例,可定義如下的矩形類別:
7
本書大寫 C 為開頭的識別字做為類別的名稱,方便和其它變數做區隔
8
建立新物件•類別只是一個模版:
▫利用它才能建立屬於該類別的物件( object )
•以矩形類別來說,從定義類別到建立物件,可想像成:▫先打造一個矩形模版 ( 定義類別 )▫再以此模版製造矩形 ( 建立物件 )
•由類別所建立的物件稱為該類別的 instance( 實例 )
9
矩形類別的物件•下圖是由矩形類別所建立的矩形物件 rect1 :
10
宣告與建立物件 欲建立某類別的物件,可藉由下面兩個步驟來達成:
(1) 以類別名稱宣告變數 (2) 利用 new 建立新的物件,並指派給先前所建立的變數 例如:
或是縮減成一行:
存取物件的內容11
存取物件裡的特定資料成員,可透過下面語法來達成:
物件名稱 . 資料成員名稱
存取物件裡特定的資料成員
舉例來說,存取物件 rect1 的寬與高,可用下列方式:
設定物件的寬與高12
想要將物件寬與高設值,其程式碼的撰寫如下:
this 的使用• 要強調「物件本身的 field 」時,可在 field 前面加上
this : this. 資料成員名稱
▫ 下面的程式碼片段是冠上 this 的寫法:
13
建構元的基本認識 • 建構元( constructor )是幫助新建立的物件設定初
值 • 建構元的名稱必須與其所屬之類別的類別名稱相同• 建構元可視為一種特殊的 method ,其語法如下:
14
修飾子 類別名稱 ( 型態 1 引數 1, 型態 2 引數 2,...) { 程式敘述 ; .... }
建構元的定義格式
建構元沒有傳回值
建構元的名稱必須和類別名稱相同可以是 public 或 private
建構元的呼叫時機 • 一般的 method
▫ 在需要用到時才呼叫• 建構元
▫ 在建立物件時,便會自動呼叫,並執行建構元的內容 ▫ 建構元可對物件的資料成員做初始化的設定▫ 初始化( initialization )就是設定物件的初值
15
建構元的使用範例16
建構元的省略 • 如果省略建構元
▫ Java 會呼叫預設的建構元( default constructor )▫ 預設的建構元是沒有任何引數的建構元,格式如下:
• 如果自行撰寫建構元,無論是否有引數,則 Java 會假設已備妥所有的建構元,不會再提供預設的建構元
17
public CCircle()
{
}
預設建構元的格式
資料結構抽象資料型態 ADT串列 – 陣列的應用實例
18
抽象資料型態 - ADT 的涵義•抽象資料型態 (ADT , abstract data types)
在設計上希望做到隱藏內部細節、展現平易外觀的目的,也就是讓使用者能善用資料結構,卻不必了解其內部的運作細節。
•理論上,我們常把 ADT 定義為將資料規格 (specification) 與實作 (implementation) 分開的資料型態。
ADT 的實例
陣列的基本操作•陣列的作用是提供循序的空間供我們使用•只需用一個唯一的索引值,便能任意指定要放入
或取出哪一個位置內的資料
•因此陣列的基本操作也就非常簡單,只有『產生』、『寫入』、與『讀取』三個動作。
•有很多實際應用的概念或事物都適合用陣列來表示,最常見的是串列、矩陣 (matrix) 與多項式 (polynomial) 。
串列的資料結構設計•串列的大小會隨著串列的使用而不斷地改變,但
陣列的大小在宣告以後就固定了。
串列的操作與處理方法•串列的操作包括 :
▫新增元素到串列尾端 (append)▫讀取元素 (read)▫寫入 (write)▫將元素插入到串列中 (insert)▫刪除元素 (delete)▫傳回串列的元素數目 (listSize)▫以及傳回儲存串列的陣列大小 (arraySize) 。
串列的程式實作•[ 串列的 ADT] list.java檔案: list.java
1. public interface list {
2. void append(int element);
3. void insert(int position, int element);
4. int delete(int position);
5. int sizeOfList();
6. int read(int position);
7. void write(int position, int value);
8. void printList();
9. }
[ 串列的產生 ]
•[ 串列的實作程式 ] myList.java•下面用一維陣列來儲存串列•另外使用一個程式變數 listSize 來記載串列的長度,也就是串列元素的數目。
int myArray[ ];int listSize=0;
•透過建構元進行初始化動作
[ 新增元素到串列尾端 (append)]
•把元素新增到串列尾端並不影響其他的串列元素•可以用 listSize 來決定新增的元素的位置•完成操作以後 listSize 的值要加上 1 ,因為串列多了一個元素。
myArray[listSize] = element
[ 插入一個串列元素 (insert)]
•有時候可能需要將新元素插入到串列的特定位置,這時就要有個更複雜的插入動作。
[ 插入一個串列元素 (insert)]
[ 刪除一個串列元素 (delete)]
•刪除一個串列元素,後面的串列元素要往前補•以下的例子把 myArray[1] 裡頭儲存的數字從串
列中移除,所以後面的數字必須往前補到空出來的陣列位置上。
[ 刪除一個串列元素 (delete)]
[ 讀取 (read)]
•要從串列讀取資料,必須指定元素的位置。
•由於串列元素是按先後順序不間斷地儲存在陣列中,所以串列元素在串列中的次序剛好就是該元素儲存在陣列上對應的索引。
[ 寫入 (write)]
•提供一個值,並指定接收這個值的串列位置
•寫入同樣可以透過函式的呼叫來執行,或者直接在程式中將一個變數或常數的值直接透過索引存入到串列的正確位置。
[ 列出所有串列元素 (printList)]
•將串列中的元素一一地列印出來,用來列印出目前串列中的元素。串列元素的數目由 listSize 來決定。
for (int i=0; i<listSize; i++)System.out.print(this.myArray[i]+" ");