js資料結構與演算法之棧結構

2021-10-11 11:16:41 字數 3556 閱讀 3037

一、棧(stack)

指:一種受限的線性表,後進先出(lifo)

其限制是僅允許在 表的一端 進行插入和刪除運算。這一端被稱為棧頂, 相對地, 把另一端稱為棧底。

lifo(last in first out) 表示就是後進入的元素, 第乙個彈出棧空間.類似於自動餐托盤, 最後放上的托盤, 往往先拿出去使用。

向乙個棧插入新元素又稱作進棧、 入棧或壓棧, 它是把新元素放到棧頂元素的上面, 使之成為新的棧頂元素。

從乙個棧刪除元素又稱作岀棧或退棧, 它是把棧頂元素刪除掉, 使其相鄰的元素成為新的棧頂元素。

二、棧的特點

先進後出,後進先出

三、程式中的棧結構

函式呼叫棧: a( b( c( d()))): 即a函式中呼叫b, b呼叫c, c呼叫d; 在a執行的過程中會將a壓入棧, 隨後b執行時b也被壓入棧, 函式c和d執行時也會被壓入棧。 所以當前棧的順序為: a - > b - > c - > d( 棧頂); 函式d執行完之後, 會彈出棧被釋放, 彈出棧的順序為d - > c - > b - > a。

遞迴: 為什麼沒有停止條件的遞迴會造成棧溢位? 比如函式a為遞迴函式, 不斷地呼叫自己( 因為函式還沒有執行完, 不會把函式彈出棧), 不停地把相同的函式a壓入棧, 最後造成棧溢位( stack overfloat)。

三、面試題示例

有六個元素6,5,4,3,2,1的順序進棧,問下列哪乙個不是合法的出棧序列( c )

a. 5 4 3 6 1 2

b. 4 5 3 2 1 6

c. 3 4 6 5 2 1

d. 2 3 4 1 5 6

解析

順序進棧並非一次性全部進棧,而是邊進邊出,而進棧順序為 6 -> 5 -> 4 -> 3 -> 2 -> 1

a答案:65進棧,5出棧,4進棧出棧,3進棧出棧,6出棧,21進棧,1出棧,2出棧(整體入棧順序符合654321);

b答案:654進棧,4出棧,5出棧,3進棧出棧,2進棧出棧,1進棧出棧,6出棧(整體的入棧順序符合654321);

c答案:6543進棧,3出棧,4出棧,之後應該5出棧而不是6,所以錯誤;

d答案:65432進棧,2出棧,3出棧,4出棧,1進棧出棧,5出棧,6出棧。符合入棧順序。

四、棧常見的操作

push(element): 新增乙個新元素到棧頂位置;

pop(): 移除棧頂的元素, 同時返回被移除的元素;

peek(): 返回棧頂的元素, 不對棧做任何修改( 該方法不會移除棧頂的元素, 僅僅返回它);

isempty(): 如果棧裡沒有任何元素就返回true, 否則返回false;

size(): 返回棧裡的元素個數。 這個方法和陣列的length屬性類似;

tostring(): 將棧結構的內容以字串的形式返回。

五、棧結構的實現

封裝棧類

function

stack()

// 方法二:相當於給整個類新增方法,這種方式節省記憶體並且效率更高

stack.prototype.

push

=function

(element)

// 2. 從棧中取出元素

stack.prototype.

pop=

function()

// 3. 檢視一下棧頂元素

stack.prototype.

peek

=function()

// 4. 判斷棧是否為空

stack.prototype.

isempty

=function()

// 5. 獲取元素棧中的個數

stack.prototype.

size

=function()

// 6. tostring方法

stack.prototype.

tostring

=function()

;return resultstring;}}

// 棧的使用

const s =

newstack()

;s.push(6

);s.push(3

);s.push(5

);s.push(8

);s.push(7

);alert

(s);

// 6 3 5 8 7

s.pop()

;s.pop();

alert

(s);

// 6 3 5

alert

(s.peek()

);// 5

alert

(s.isempty()

);// false

alert

(s.size()

);// 3

函式:將十進位制轉成二進位制

function

stack()

// 2. 從棧中取出元素

stack.prototype.

pop=

function()

// 3. 檢視一下棧頂元素

stack.prototype.

peek

=function()

// 4. 判斷棧是否為空

stack.prototype.

isempty

=function()

// 5. 獲取元素棧中的個數

stack.prototype.

size

=function()

// 6. tostring方法

stack.prototype.

tostring

=function()

;return resultstring;}}

function

dec2bin

(decnumber)

// 3. 從棧中取出0和1

let binarystring ='';

while

(!stack.

isempty()

)return binarystring;

}// 測試十進位制轉二進位制函式

alert

(dec2bin

(100))

;// 1100100

alert

(dec2bin(10

));// 1010

alert

(dec2bin

(1000))

;// 1111101000

《資料結構與演算法》之棧

資料結構與演算法 之鍊錶 資料結構與演算法 之佇列 資料結構與演算法 之排序 資料結構與演算法 之二分查詢 資料結構與演算法 之二叉樹 關於 棧 我有乙個非常貼切的例子,就是一摞疊在一起的盤子。我們平時放盤子的時候,都是從下往上乙個乙個放 取的時候,我們也是從上往下乙個乙個地依次取,不能從中間任意抽...

資料結構與演算法之棧

中綴表示式實現多位數的計算 實現 public class calculatordemo else 否則直接入符號棧 else 如果是數字直接入數棧 else else index if index expresion.length 表示式掃瞄完後就順序的從數棧和符號棧中pop出相應的數字和符號並執...

資料結構與演算法之棧

字首表示式 求值 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧 重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果 例如 3 4 5 6 對應的字首表示式就是 3 4 5 6 針對字首表示...