C 物件導向程式設計高階(一) 實現棧

2022-02-06 19:42:56 字數 1778 閱讀 6035

如何用c#編寫乙個棧類?   

關鍵在於這樣的乙個類應該如何設計呢?首先要確立物件導向的程式設計思想,即類是對實體進行合理地抽象和建模,而這種思想將貫徹在我們程式設計的整個過程中。下面我們一步一步來做。

對於設計乙個類而言我們應該由外而內的進行設計,首先考慮它對外部提供的介面,再去考慮其內部的安排。對於棧而言,最重要的外部特性就是壓棧和彈棧,所以要設計兩個方法push和pop,對於壓棧而言,壓進去的元素存放在哪,所以就要用陣列來開闢一段連續的儲存空間來對棧進行順序儲存。所以初步設計如下:

public

class

stack

public

intpop()

}

具體的方法應該如何實現呢?我們知道壓棧和彈棧都是在棧頂進行的,如何表示棧頂呢?我們可以設定乙個計數器cout對每次壓棧操作進行計數,同樣對於彈棧操作也進行計數,使得計數器總是表示棧內元素的個數。所以在之前的**中新增相關語句,現在**如下:

public

class

stack

public

intpop()

}

接著我們來分別實現兩個方法的功能。

public

void push(int

element)

public

intpop()

至此兩個方法的功能已經基本實現。

現在要考慮乙個問題,即棧的儲存空間是用陣列來固定分配的,那麼壓棧就可能出現棧滿後溢位的情況。為了應對這種異常情況我們需要採取相應的措施。類似的棧也會出現棧空的情況下彈棧的情況。我們先來處理後者:

public

intpop()

int ele = this.array[this.count - 1

]; --this

.count;

return

ele;

}

然後我們在測試方法中新增try-catch語句便能夠對丟擲的異常進行處理。

而對於push方法,我們希望在棧滿的情況下追加儲存空間應該如何做呢?

我們再定義乙個陣列,開闢出兩倍於原陣列的連續儲存空間,然後將原陣列中的元素拷貝給新陣列,再將新陣列的引用賦值給原陣列以便於外部使用。

public

void push(int

element)

this.array =array2;

}this.array[this.count] =element;

this.count++;

}

這樣一來,這個類就已經基本設計好了。

在main方法中新增如下測試**:

static

void main(string

args)

", ele1);

int ele2 =stack.pop();

console.writeline(""

, ele2);

int ele3 =stack.pop();

console.writeline(""

, ele3);

int ele4 =stack.pop();

console.writeline(""

, ele4);

}catch

(exception exception)

console.read();

}

執行結果如下:

C 物件導向高階程式設計 一 基礎篇

概要 知識點1 建構函式與析構函式 知識點2 引數與返回值 知識點3 const 知識點4 函式過載 要與重寫區分開 知識點5 友元 先以c 的兩大經典class complex 不含指標,string 含指標 之一 complex 複數類 做例子.ifndef complex hpp 防止標頭檔案...

C 物件導向高階程式設計 筆記

最近重新複習了一下c 物件導向高階程式設計中知識點,學而時習之,不亦說乎。拷貝建構函式,拷貝的是同型別的物件 賦值建構函式 檢測自我賦值 為什麼?有什麼作用?if this str return this 組合繼承 委託示例 委託 繼承 composite pimpl 編譯防火牆 左邊永遠不用編譯,...

c 物件導向程式設計(一)

一 繼承 c 中,派生類只能從乙個類中繼承。c 中的繼承符合下列規則 1 繼承是可傳遞的。2 派生類應當是對基類的擴充套件。派生類可以新增新的成員,但不能除去己經繼承的成員的定義 3 建構函式和析構函式不能被繼承。除此以外的其它成員,不論對它們定義了怎樣的訪問方式,都能被繼承。基類中成員的訪問方式只...