日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++实现一个栈(使用类模板)

發布時間:2024/4/17 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++实现一个栈(使用类模板) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、代碼

1.1 調試信息的配置

//一個調試開關,如果要看調試信息,就把這個開關的注釋去掉 //#define USEDEBUG//如果調試開關打開了,就定義好調試的輸出函數(其實是個宏), #ifdef USEDEBUG #define DEBUG(fmt, arg...)\do{\printf("%s %d %s() : ", __FILE__, __LINE__, __func__);\printf(fmt, ##arg);\}while(0) #else //如果沒有打開,這個函數什么也不做 #define DEBUG(fmt, arg...) #endif

1.2 棧類的聲明

//定義模版類 ClsStack template<typename T> class ClsStack {//這個類的=型私有數據,主要用于對棧的內存分配進行管理,//用戶不需要關心內存,只需要調用對外提供的幾個方法就可以了private :T ** __m_Data;//存儲數據的內存開始地址int __m_pos;//記錄棧尾的位置,插入數據時插入這個位置int __m_memsize;//記錄內存的總數protected ://重新分配內存空間,可以減小,也可以增大int __resize(int n);//獲取給定參數的雙倍內存,其實主要目的是防止參數是0int __doublesize(int n);public :ClsStack(int n = 0);~ClsStack();//彈出棧頂int pop (T ** ppData);//獲取棧頂元素,但是不彈出int top (T ** ppData);//向棧添加數據int push(T * pData);//清空整個棧的數據int clear(void (*)(T*));//輸出整個棧的數據,用于調試void printStack(T * p[], int pos); };

1.3 構造函數的實現

//構造函數 //默認參數值是0 //參數非零時的作用是用于初始化棧空間的大小 template<typename T> ClsStack<T>::ClsStack(int n) {__m_Data = NULL;__m_pos = -1;__m_memsize = 0;if(0 != n){__m_Data = new T * [n];if(NULL != __m_Data){__m_memsize = n;}} }

1.4) 析構函數的實現

//析構函數 //在棧對象被銷毀時,需要把申請的內存空間釋放 template<typename T> ClsStack<T>::~ClsStack() {if(NULL != __m_Data){delete __m_Data;__m_Data = NULL;}__m_pos = -1;__m_memsize = 0; }

1.5)內存控制函數

//計算新的內存空間 //當參數是0的時候,指定內存空間是1 //參數不是0的時候,內存加倍 template<typename T> int ClsStack<T>::__doublesize(int n) {int x = 0;if(0 == n){x = 1;}else{x = n * 2;}return x; }//重新設定棧的大小 //就是擴展當前的內存容量到指定的大小 template<typename T> int ClsStack<T>::__resize(int n) {T ** p = new T * [n];if(NULL == p){return -1;}memset(p, 0, sizeof(T *) * (n));if(NULL != __m_Data){//printStack(__m_Data, __m_pos);if( NULL == memcpy(p, __m_Data, __m_memsize * sizeof(T *))){DEBUG("memcpy faild\n");delete p;return -1;}//printStack(p, __m_pos);delete __m_Data;}__m_Data = p;__m_memsize = n;return 0; }

1.6)棧操作函數的實現

//彈出數據 //數據通過參數指定的指針返回 template<typename T> int ClsStack<T>::pop(T ** ppData) {if(NULL == ppData){return -1;}int r = 0;if(-1 == __m_pos){*ppData = NULL;r = -1;}else{*ppData = __m_Data[__m_pos --];r = 0;DEBUG("memsize : [%u], pos : [%d], p = [0X%08X]\n", __m_memsize, __m_pos + 1, (unsigned int)*ppData);}return r; }//獲取棧頂元素,并不彈出 template<typename T> int ClsStack<T>::top(T ** ppData) {if(NULL == ppData){return -1;}int r = 0;if(-1 == __m_pos){*ppData = NULL;r = -1;}else{*ppData = __m_Data[__m_pos];r = 0;}return r; }//向棧壓入元素 //棧會自己判斷內存,如果內存不足會自動增加內存 template<typename T> int ClsStack<T>::push(T * pData) {if(__m_pos + 1 >= __m_memsize){int n = __doublesize(__m_memsize);if(0 != __resize(n)){return -1;}}__m_Data[++__m_pos] = pData;DEBUG("memsize : [%u], pos : [%d], p = [0X%08X]\n", __m_memsize, __m_pos, (unsigned int)__m_Data[__m_pos]);return 0; }

1.7)清空棧數據函數

//清空棧,需要指定回收元素數據的函數, //否則無法知道如何回收由用戶申請的內存空間 template<typename T> int ClsStack<T>::clear(void (*F)(T *)) {if(NULL == F && __m_pos >= 0){return -1;}if(NULL != __m_Data && 0 != __m_memsize){for(int i = 0; i <= __m_pos; i++){F(__m_Data[i]);__m_Data[i] = NULL;}delete __m_Data;}__m_Data = NULL;__m_pos = -1;__m_memsize = 0; }

1.8)調試輔助函數

//輸出棧的內存狀態,調試時使用 template<typename T> void ClsStack<T>::printStack(T * p[], int pos) {int i = 0;for(i = 0; i <= pos; i++){printf("[%08u] = [0X%08X]\n", i, NULL == p ? 0 : p[i]);}printf("----------------------------\n"); }

1.9)測試代碼

//test 函數定義 #define TEST_EQ(a, b)\do{\if(a == b)\{\printf("\033[0;32m[SUCCESS %5d]\033[0m\n", __LINE__);\}\else\{\printf("\033[0;31m[FAILD %5d]\033[0m\n", __LINE__);\}\}while(0)int main() {ClsStack<int> objStack;int x = 10;int * p = &x;//向棧內壓入數據 objStack.push(p);int i = 0;for(i = 0; i <= 10; i++){int * z = new int;*z = i;objStack.push(z);}//開始彈出數據for(i = 10; i >= 0; i--){int * z = NULL;objStack.pop(&z);if(NULL == z){printf("z == NULL\n");continue;}//測試彈出的數據和壓入的數據是否一致TEST_EQ(i, *z);delete z;}int * g = NULL;objStack.pop(&g);TEST_EQ(x, *g); }

?

完整代碼如下(折疊了) :

?View Code

?


2、運行結果

  2.1、編譯

g++ -g -c -o stack.o stack.cpp -Wall -I./ g++ -g -o stack stack.o -Wall -I./

?

  2.2、運行結果

$ ./stack [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 288] [SUCCESS 293]

??


本文轉自郝峰波博客園博客,原文鏈接:http://www.cnblogs.com/fengbohello/p/4547598.html,如需轉載請自行聯系原作者


總結

以上是生活随笔為你收集整理的C++实现一个栈(使用类模板)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。