C++Stack棧類(lèi)模版實(shí)例詳解
1.棧的介紹
棧的實(shí)現(xiàn)方式分為3種
- 基于靜態(tài)數(shù)組實(shí)現(xiàn),內(nèi)部預(yù)設(shè)一個(gè)很大的數(shù)組對(duì)象, 實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是空間受限。
- 基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),內(nèi)部預(yù)設(shè)一個(gè)容量值,然后分配一段內(nèi)存空間數(shù)組,如果入棧大于默認(rèn)容量值時(shí),則再次擴(kuò)大分配新的內(nèi)存數(shù)組,并將舊數(shù)組拷貝至新數(shù)組及釋放舊數(shù)組.
- 基于雙向循環(huán)鏈表實(shí)現(xiàn)
棧的函數(shù)需要實(shí)現(xiàn)如下所示:
T pop() :
出棧并返回棧頂元素void push(const T &t) :
入棧const T & top() const :
獲取const類(lèi)型棧頂元素T &top() :
獲取棧頂元素int length() const:
獲取數(shù)量(父類(lèi)已經(jīng)實(shí)現(xiàn))void clear(): 清空棧(父類(lèi)已經(jīng)實(shí)現(xiàn))
本章,我們實(shí)現(xiàn)的?;趧?dòng)態(tài)數(shù)組實(shí)現(xiàn),它的父類(lèi)是我們之前實(shí)現(xiàn)的Vector類(lèi):
C++ 動(dòng)態(tài)數(shù)組模版類(lèi)Vector實(shí)例詳解
所以代碼實(shí)現(xiàn)會(huì)非常簡(jiǎn)單.
2.棧實(shí)現(xiàn)
代碼如下所示:
#ifndef Stack_H #define Stack_H #include "throw.h" // throw.h里面定義了一個(gè)ThrowException拋異常的宏,如下所示: //#include <iostream> //using namespace std; //#define ThrowException(errMsg) {cout<<__FILE__<<" LINE"<<__LINE__<<": "<<errMsg<<endl; (throw errMsg);} #include "Vector.h" template<class T> class Stack : public Vector<T> { public: T pop() { if(Vector<T>::isEmpty()) { // 如果棧為空,則拋異常 ThrowException("Stack is empty ..."); } T t = Vector<T>::data()[Vector<T>::length() - 1]; Vector<T>::resize(Vector<T>::length() - 1); return t; } // 入棧,實(shí)際就是append尾部添加成員 void push(const T &t) { Vector<T>::append(t); } T &top() { if(Vector<T>::isEmpty()) { ThrowException("Stack is empty ..."); } return Vector<T>::data()[Vector<T>::length() - 1]; } const T &top() const { if(Vector<T>::isEmpty()) { ThrowException("Stack is empty ..."); } return Vector<T>::data()[Vector<T>::length() - 1]; } }; #endif // Stack_H
3.代碼測(cè)試
int main(int argc, char *argv[]) { Stack<int> stack; cout<<"******* current length:"<<stack.length()<<endl; for(int i = 0; i < 5; i++) { cout<<"stack.push:"<<i<<endl; stack.push(i); } cout<<"******* current length:"<<stack.length()<<endl; while(!stack.isEmpty()) { cout<<"stack.pop:"<<stack.pop()<<endl; } return 0; }
運(yùn)行打印:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C 語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 web 服務(wù)器的原理解析
這篇文章主要介紹了C 語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 web 服務(wù)器的原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11c語(yǔ)言鏈表基本操作(帶有創(chuàng)建鏈表 刪除 打印 插入)
這篇文章主要介紹了c語(yǔ)言鏈表基本操作,大家參考使用吧2013-12-12C語(yǔ)言進(jìn)階教程之字符函數(shù)&字符串函數(shù)
C語(yǔ)言提供了豐富的字符串處理函數(shù),可以對(duì)字符串進(jìn)行輸入、輸出、合并、修改、比較、轉(zhuǎn)換、復(fù)制、搜索等操作,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之字符函數(shù)&字符串函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-03-03Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題
這篇文章主要介紹了Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析
這篇文章主要介紹了C語(yǔ)言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02圖解AVL樹(shù)數(shù)據(jù)結(jié)構(gòu)輸入與輸出及實(shí)現(xiàn)示例
這篇文章主要為大家介紹了C++圖解AVL樹(shù)數(shù)據(jù)結(jié)構(gòu)輸入與輸出操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05