C++实现一个栈
我們先說下棧的知識,先看下我們之前寫的文章
棧,C語言實現(xiàn)
如何自己實現(xiàn)一個棧
堆和棧的區(qū)別(轉(zhuǎn)過無數(shù)次的文章)
這是一個棧
這是我們把數(shù)據(jù)入棧的操作
這是數(shù)據(jù)出棧的操作
之前僚機號里面發(fā)了一個用C++實現(xiàn)的棧文章,比較簡單,基于上一次的代碼再升華一下,我認(rèn)為在熟悉快速寫出一個棧代碼,對大家在面試筆試中幫助是非常大的。
下面寫了兩段代碼實現(xiàn)棧,代碼不一定是完美的,肯定存在問題,但是基本思路我覺得還是可以的,有兩種方法來實現(xiàn),第一種是用數(shù)組來實現(xiàn)棧,還有一種是用指針實現(xiàn)。
如果在面試,面試官說讓你用代碼實現(xiàn)一個棧,因為面試的時間比較緊,而且大多數(shù)人在面試的時候可能會比較緊張,我建議用數(shù)組實現(xiàn),用數(shù)組實現(xiàn)一個棧會簡單很多,說白了有手就行,當(dāng)然了,你要是可以用指針實現(xiàn),而且寫得比較全面,這個是加分的地方。
用數(shù)組實現(xiàn)的時候,我們一個元素就是一個數(shù)組的值,數(shù)組的下標(biāo)可以把整個棧串聯(lián)起來。
#用數(shù)組實現(xiàn)棧
#include?<iostream> using?namespace?std;class?IntStack{enum?{ssize?=?100};int?stack[ssize];int?top;public:/*構(gòu)造函數(shù),初始化top變量的值*/IntStack():top(0){}/*插入數(shù)據(jù)*/void?push(int?i){stack[top++]?=?i;}/*遍歷*/void?TraverseStack(){cout?<<?"---"?<<?endl;for(int?i?=?0;i<top;?++i){?if(i?!=?top?-1)cout?<<stack[i]?<<?"->";elsecout?<<stack[i]?<<?endl;???}?}?/*彈出數(shù)據(jù)*/int?pop(){return?stack[--top];} };int?main() {IntStack?is;for(int?i?=?0;?i<?20;?i++){is.push(i*i);}is.TraverseStack();is.pop();is.TraverseStack();is.pop();is.TraverseStack();is.push(77);is.push(77);is.push(77);is.TraverseStack(); }程序輸出
--- 0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->324->361 --- 0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->324 --- 0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289 --- 0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->77->77->77-------------------------------- Process?exited?after?0.03563?seconds?with?return?value?0 請按任意鍵繼續(xù).?.?.上圖是用數(shù)組來實現(xiàn)的,用數(shù)組實現(xiàn)的棧有一個缺陷,就是棧的大小在定義數(shù)組的時候已經(jīng)確定了,不能做到動態(tài)增長。
鏈表有點不一樣,每個節(jié)點都需要有一個地址,用來保存下一個節(jié)點的地址,我們還需要一個head節(jié)點,來保存整個棧的頭,這樣不至于讓我們的棧失去方向。
#用鏈表來實現(xiàn)一個棧
#include?<iostream> using?namespace?std;class?Node{public:int?data;Node?*next; };class?Stack{/*指向棧頂?shù)闹羔?/Node?*top;/*棧長度*/int?size;?public:/*構(gòu)造函數(shù),初始化top變量的值*/Stack(){top?=?new?Node;top->next?=?NULL;/*棧長度設(shè)置為0*/size?=?0;cout?<<?"Stack()"<<endl;}~Stack(){cout?<<?"~Stack()"<<endl;Node?*pTemp?=?top;while(top?!=?NULL){pTemp?=?top;top?=?top->next;delete?pTemp;}size?=?0;}/*插入數(shù)據(jù)*/void?push(int?i){if(top?==?NULL){cout?<<?"stack?is?null"?<<?endl;return;}/*搞一個temp節(jié)點出來*/Node?*temp?=?new?Node;temp->data?=?i;temp->next?=?NULL;/*把temp節(jié)點連接到棧里面去*/if(size?==?0){top?=?temp;?}?else{temp->next?=?top;top?=?temp;}size++;}/*遍歷*/void?TraverseStack(){if(top->next?==?NULL){cout?<<?"stack?is?null"?<<?endl;return;}cout?<<?"---"?<<?endl;Node?*pTemp?=?top;while(pTemp?!=?NULL){if(pTemp->next!=NULL)cout?<<?pTemp->data?<<"->";elsecout?<<?pTemp->data?<<endl;pTemp?=?pTemp->next;}}?/*彈出數(shù)據(jù)*/int?pop(){if(size?==?0){cout?<<?"stack?is?empty"?<<?endl;return?(0);}if(top?==?NULL){cout?<<?"stack?is?empty"?<<?endl;return?(0);}Node?*temp?=?top;top=top->next;cout?<<"pop->data:"<<?temp->data?<<endl;delete?temp;size--;return?(0);}/*獲取棧長度*/int?getLength(){return?size;} };int?main() {Stack?*pStack?=?new?Stack();pStack->push(12);pStack->push(13);pStack->push(14);pStack->push(15);pStack->TraverseStack();pStack->pop();pStack->TraverseStack();pStack->pop();pStack->TraverseStack();delete?pStack;? }程序輸出
Stack() --- 15->14->13->12 pop->data:15 --- 14->13->12 pop->data:14 --- 13->12 ~Stack()-------------------------------- Process?exited?after?0.03555?seconds?with?return?value?0 請按任意鍵繼續(xù).?.?.推薦閱讀:
? ??專輯|Linux文章匯總
? ??專輯|程序人生
? ??專輯|C語言
嵌入式Linux
微信掃描二維碼,關(guān)注我的公眾號?
總結(jié)
- 上一篇: 使用croc命令在Linux系统电脑之间
- 下一篇: 搞懂C++为什么难学,看这篇就够了!