一、棧(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 針對字首表示...