棧的模擬實現及常見演算法

2022-01-14 06:21:10 字數 2019 閱讀 7326

棧是一種特殊的線性表,它只能在乙個表的乙個固定端進行資料結點的插入和刪除操作。棧按照後進先出的原則來儲存資料,也就是說,先插入的資料將被壓入棧底,最後插入的資料在棧頂,讀出資料時,從棧頂開始逐個讀出。棧在組合語言程式中,經常用於重要資料的現場保護。棧中沒有資料時,稱為空棧。

class stack;

//入棧push(item)

else

} //出棧

pop()

else

} //判斷棧是否為空

empty()

//返回位於棧頂的元素

peek()

//棧的大小

size()

}

進製轉換

利用棧將轉化數字的進製,假設將數字n轉換為以b為基數的數字,方法如下:

最高位為n % b,將此位壓入棧

使用math.floor(n/b)代替n

重複步驟1和2,直到n等於0,且沒有餘數

持續將棧內元素彈出,直到棧為空

function

mulbase(num, base) while(num > 0)

var str = '';

while(stack.length() > 0)

return

str }

回文判斷

利用棧,可以輕鬆判斷乙個字串是否是回文(回文指乙個字串從前往後寫和從後往前寫都一樣)

function

ispalindrome(word)

var rword = '';

while(stack.length() > 0)

return rword ==word;

}

當然正常我們直接使用

var arr =array.prototype.slice.call(word);

return arr.reverse().join('') == word

實現特殊棧

實現乙個特殊的棧,有棧的正常方法,能返回棧裡的最小值。要求時間複雜度為o(1)  

思路:建立兩個棧,乙個棧 data 放正常的資料。另乙個棧 mins 放當前資料中的最小值。例如:若新新增的資料小於當前的最小值,兩個棧都新增新的資料。若新新增的資料大於當前棧中的最小值,mins 仍然新增當前最小值。

而且,data出資料的時候,mins同時出棧。

有效的括號

leetcode 20:給定乙個只包括 '(',')','','[',']' 的字串,判斷字串是否有效。

有效字串需滿足:左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。

var isvalid = function

(s) ': 3}

let stack =

for (let i = 0; i < s.length; i++)

else

} if (stack.length > 0) return

false

return

true

}

每日溫度

leetcode 739: 根據每日氣溫列表,請重新生成乙個列表,對應位置的輸出是需要再等待多久溫度才會公升高超過該日的天數。如果之後都不會公升高,請在該位置用 0 來代替。

例如,給定乙個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。

const dailytemperatures = function

(t)

//注意棧裡存的不是溫度值,而是索引值,這是為了後面方便計算

stack.push(i)

}//返回結果陣列

return

res

};

其他利用堆疊,還可以解決如下常見問題:

參考鏈結

棧和佇列的模擬實現

ifndef stack h define stack h include include include typedef int stdatatype typedef struct stack stack void stackinit stack ps 初始化 void stackdestory ...

佇列的定義及模擬實現

佇列是一種特殊的線性表 特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素...

new 原理及模擬實現

new 運算子建立乙個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。舉個栗子 function car color car.prototype.start function var car new car black car.color 訪問建構函式裡的屬性 black car.star...