1.基本概念node
棧中的元素遵照「先進後出」的原則(LIFO,Last In First Out)git
只能在棧頂進行插入和刪除操做github
壓棧(或推入、進棧)即push,將數據放入棧頂並將棧頂指針加一數組
出棧(或彈出)即pop,將數據從棧頂刪除並將棧頂指針減一數據結構
棧的基本操做有:pop,push,判斷空,獲取棧頂元素,求棧大小函數
2.構造棧spa
能夠使用數組構造棧,也能夠使用單向鏈表構造,我以爲使用單向鏈表更加靈活方便,下面的例子我使用單向鏈表來構造棧。指針
單向鏈表的頭插法比較適合,鏈表頭做爲棧頂:code
節點的數據結構:blog
template<class T> struct node { T value; //儲存的值 node<T>* next; node() :next(nullptr){} //構造函數 node(T t) :value(t), next(nullptr){} };
用模板類構造一個簡單的stack類:
template<class T> class myStack { int cnts; //入棧數量 node<T> *head; //棧的頭部 public: myStack(){ cnts = 0; head = new node<T>; } void stackPush(T arg); //入棧 T stackPop(); //出棧 T stackTop(); //獲取棧頂元素 void printStack(); //打印棧 int counts(); //獲取棧內元素個數 bool isEmpty(); //判斷空 }; template<class T> void myStack<T>::stackPush(T arg) { node<T> *pnode = new node<T>(arg); //申請入棧元素的空間 pnode->next = head->next; head->next = pnode; cnts++; } template<class T> T myStack<T>::stackPop() { if (head->next!=nullptr) { node<T>* temp = head->next; head->next = head->next->next; T popVal = temp->value; delete temp; return popVal; } } template<class T> T myStack<T>::stackTop() { if (head->next!=nullptr) { return head->next->value; } } template<class T> void myStack<T>::printStack() { if (head->next != nullptr) { node<T>* temp = head; while (temp->next != nullptr) { temp = temp->next; cout << temp->value << endl; } } } template<class T> int myStack<T>::counts() { return cnts; } template<class T> bool myStack<T>::isEmpty() { if (cnts) return false; else return true; }