本文使用c++實現棧資料結構,棧資料結構同之前實現的vector和list資料結構一樣都屬於線性序列結構,但是棧的資料操作範圍僅限於邏輯上的特定頂端,即只能對棧頂進行操作。由於棧結構具有的簡潔性和規範性,它既為構建更複雜、更高階資料結構的基礎,也是演算法設計的基本出發點。鑑於其的基礎性及使用的頻繁程度,其常常作為標準配置的基本資料結構以硬體直接實現。因此,棧結構無論就工程或是理論而言,其基礎性地位都是其他資料結構無法比擬的。
棧結構的特點:後進先出(last in first out,lifo),且棧結構及其操作天然地具有遞迴巢狀性。
一、棧資料結構的實現
棧結構的實現可以通過vector和list資料結構直接封裝得到,這裡採用c++的繼承機制,直接從vector類繼承得到stack類,然後對特定的函式進行封裝重新命名,就可以很方便地實現stack資料結構。(vector.h見之前的部落格)
stack介面列表 操作
功能物件
stack()
預設建構函式
~stack()
預設析構函式
empty()
判斷棧內部是否為空
棧size()
返回棧內部元素的個數
棧push(const t e)
將指定元素入棧
棧pop()出棧棧
top()
返回棧頂元素的引用
棧
#pragma once
#include "vector.h"
templateclass stack :public vector
bool empty() //判斷是否為空
int size()
void push(const t e) //壓棧
t pop() //彈棧
t& top() //取頂
};
二、棧資料結構的應用
(a) 作業系統函式呼叫棧
在windows等大部分的作業系統中,對於每乙個二進位制應用程式都配有乙個呼叫棧(call stack),借助呼叫棧可以跟蹤程序內的所有函式,記錄它們之間的相互呼叫關係,並保證在每一呼叫例項執行完畢後,可以準確地返回。
呼叫棧的基本單位是幀,每當乙個函式被呼叫時,都會相應地建立一幀,記錄改函式例項在二進位制程式中的返回位址,以及區域性變數,傳入引數等,並將改幀壓如呼叫棧,這些引數也就相當於保護現場。若在該函式返回之前又發生其他函式的呼叫,那麼同樣的會生成乙個新的幀並壓人呼叫棧,只有當最後呼叫的函式返回並從呼叫棧中彈出,執行控制權才交給之前呼叫的函式。特別的,棧底肯定是main函式,當所有程式執行完畢,main函式所在的幀也會彈出,這時執行控制權再次回到作業系統。
(b) 將十進位制數轉換成任意進製數
這裡使用棧結構作為容納程式輸出的容器,憑藉著其後進先出和容量方面的自適應性,能很好地完成這個任務。
void convert(stack& s, int n, int base) //快取棧,待轉換10進製數,目標進製基數
; s.push(digit[n%base]);
convert(s, n / base, base);
}
(c) 編譯器檢查**中括號是否匹配正確
括號檢查是編譯器對**的語法檢查中很重要的一項,借助棧結構後進先出的特點,編寫程式對待測**從左至右進行掃瞄,將出現的左括號壓入棧結構中,只要出現的右括號就進行彈棧操作,通過檢查彈出的括號和當前的右括號是不是同一型別(如'('和')','['和']'),即可很方便地實現對**括號的檢查。
bool paren(const char expr, rank lo, rank hi)
': if (!s.empty() || (s.pop() != '
} return s.empty();
}
其他,由於棧結構後進先出的特點,很適合儲存演算法的執行路徑,所以棧結構在很多問題的求解過程中經常被使用(如,n皇后問題、迷宮問題等)。 資料結構 棧(Stack)
只允許在一端進行插入或刪除操作的線性表。首先,棧是一種線性表,但限定這種線性表只能在某一段進行插入和刪除操作。棧頂 top 線性表允許進行插入和刪除的一端。棧底 bottom 固定的,不允許進行插入和刪除的另一端。空棧 不含任何元素。如上圖 a1為棧底元素,an為棧頂元素。由於棧只能在棧頂進行插入和...
資料結構 棧stack
棧的概念與資料結構 棧 有時稱為 後進先出棧 是乙個元素的有序集合,其中新增移除新元素總發生在同一端。這一端通常稱為 頂部 與頂部對應的端稱為 底部 棧的底部很重要,因為在棧中靠近底部的元素是儲存時間最長的。最近新增的元素是最先會被移除的。這種排序原則有時被稱為 lifo,後進先出。它基於在集合內的...
資料結構 棧(Stack)
棧 英語 stack 又稱為堆疊或堆疊,棧作為一種資料結構,它按照先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料 最後乙個資料被第乙個讀出來 由於堆疊資料結構只允許在一端進行操作,因而按照後進先出 lifo last in first out 的...