標籤:++ class 訪問 多少 記錄 需要 測試 函數 元素
棧就是和列表類似的一種資料結構,它可用來解決電腦世界裡的很多問題。棧是一種高效的資料結構,因為資料只能在棧頂添加或刪除,所以這樣的操作很快,而且容易實現。棧的使用遍布程式語言實現的方方面面,從運算式求值到處理函數調用。 1.對棧的操作: 棧是一種特殊的列表,棧內的元素只能通過列表的一端訪問,這一端稱為棧頂。棧被稱為一種後入先出的資料結構。由於棧具有後入先出的特點,所以任何不在棧頂的元素都無法訪問。為了得到棧底的元素,必須先拿掉上面的元素。對棧的兩種主要操作是將一個元素壓入棧和將一個元素彈出棧。入棧使用push() 方法,出棧使用pop() 方法。另一個常用的操作是預覽棧頂的元素。pop() 方法雖然可以訪問棧頂的元素,但是調用該方法後,棧頂元素也從棧中被永久性地刪除了。peek() 方法則只返回棧頂元素,而不刪除它。 為了記錄棧頂元素的位置,同時也為了標記哪裡可以加入新元素,我們使用變數top當向棧內壓入元素時,該變數增大;從棧內彈出元素時,該變數減小。push()、pop() 和peek() 是棧的3 個主要方法,但是棧還有其他方法和屬性。clear() 方法清除棧內所有元素,length 屬性記錄棧內元素的個數。我們還定義了一個empty 屬性,用以表示棧內是否含有元素,不過使用length 屬性也可以達到同樣的目的。 2.棧的實現:實現一個棧,當務之急是決定儲存資料的底層資料結構。這裡採用的是數組。 代碼:
<script type="text/javascript">/*** 用數組dataStore 儲存棧內元素,建構函式將其初始化為一個空數組。* 變數top 記錄棧頂位置 被建構函式初始化為0,表示棧頂對應數組的起始位置0。* 如果有元素被壓入棧,該變數的值將隨之變化。*/function Stack(){ this.dataStore = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; this.clear = clear; this.length = length;}function push(element){ this.dataStore[this.top] = element; this.top ++;}function pop(){ this.top --; return this.dataStore[this.top];}/*** 返回數組的第top-1 個位置的元素,即棧頂元素*/function peek(){ return this.dataStore[this.top - 1];}/*** 有時候需要知道棧記憶體儲了多少個元素。* length() 方法通過返回變數top 值的方式返回棧內的元素個數:*/function length(){ return this.top;}/*** 可以將變數top 的值設為0,輕鬆清空一個棧:*/function clear() { this.top = 0;}//測試代碼//倒數第二行返回undefined,這是因為棧被清空後,棧頂就沒值了,這時使用peek() 方法預覽棧頂元素,自然得到undefined。var s = new Stack();s.push("David");s.push("Raymond");s.push("Bryan");console.log("length: " + s.length()); //length: 3console.log(s.peek()); //Bryanvar popped = s.pop();console.log("The popped element is: " + popped); //The popped element is: Bryanconsole.log(s.peek()); //Raymonds.push("Cynthia");console.log(s.peek()); //Cynthias.clear(); console.log("length: " + s.length()); //length: 0console.log(s.peek()); //undefineds.push("Clayton"); console.log(s.peek()); //Clayton</script>
資料結構與演算法JavaScript描述——棧