三 資料結構 棧 stack 的實現

2021-09-01 23:01:57 字數 2024 閱讀 4204

本文使用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 的...