C++實現鏈棧的基本操作
阿新 • • 發佈:2019-01-04
之前對順序棧寫了基本操作,覺得有必要也動手練練棧的連結串列實現。
對於鏈棧,一般不會出現棧滿的情況。
鏈棧標頭檔案定義如下:
實現的基本功能如下:#ifndef CSTOCK_H_ #define CSTOCK_H_ typedef int elemType; struct Item { elemType data; Item * p_next; }; class CStock { public: CStock(); CStock(const CStock & otherStock); //拷貝建構函式; CStock & operator = (const CStock & otherStock); //=運算子過載; void push(elemType x);//進棧操作; bool pop(elemType &x); //出棧操作; bool isEmpty() const; //判斷棧空; void clear();//清空棧,使棧為空; int size() const; //獲得棧的大小; void print() const; //列印棧內元素; ~CStock(); public: Item *p_Top;//棧頂 }; #endif
#include "CStock.h" #include <iostream> using std::cout; using std::endl; CStock::CStock(): p_Top(NULL)//建構函式 { } //拷貝建構函式 便於定義時初始化,如 CStock s1 = stock; 預設的會出現潛在問題 CStock::CStock(const CStock & otherStock):p_Top(NULL) { *this = otherStock; } // =運算子過載,便於賦值,如:CStock s1; .... CStock s2; s2 = s1; 預設的會出現潛在問題。 我寫的這個方法覺得不好,有好的寫法希望大神能指導指導。 CStock & CStock::operator =(const CStock & otherStock) { CStock tempStock; Item * copyElement = otherStock.p_Top; //將棧otherStock的元素出棧,依次進入tempStock內,元素的位置順序和otherStock相反; while(copyElement) { tempStock.push(copyElement->data); copyElement = copyElement->p_next; } copyElement = tempStock.p_Top; //將tempStock的元素出棧,依次進入此棧內,元素位置和otherStock相同; while(copyElement) { push(copyElement->data); copyElement = copyElement->p_next; } return *this; } //進棧操作 void CStock::push(elemType x) { Item * pushElement = new Item; pushElement->data = x; if(!p_Top)//如果棧為空時 { p_Top = pushElement; pushElement->p_next = NULL; } else //若棧不為空時 { pushElement->p_next = p_Top; p_Top = pushElement; } } //出棧操作,若棧不為空,資料有形參x帶至主調函式,出棧失敗函式返回false; bool CStock::pop(elemType &x) { if(!p_Top) { return false; } x = p_Top->data; p_Top = p_Top->p_next; return true; } //判斷棧是否為空 bool CStock::isEmpty() const { return p_Top == NULL; } //清空棧,使棧置為空棧 void CStock::clear() { Item * deleteElement; while(p_Top) { deleteElement = p_Top; p_Top = p_Top->p_next; delete deleteElement; } } //獲得棧的大小 int CStock::size() const { int length = 0; Item *temp = p_Top; while(temp && ++length) { temp = temp->p_next; } return length; } //列印棧內元素 void CStock::print() const { int count = 0; Item * temp = p_Top; while(temp && ++count) { cout << temp->data << "\t"; if(count % 5 == 0) cout << endl; temp = temp->p_next; } } //解構函式,提供對指標成員的釋放,預設的會出現潛在問題 CStock::~CStock(void) { Item * deleteElement; while(p_Top) { deleteElement = p_Top; p_Top = p_Top->p_next; delete deleteElement; } }