堆棧(英文:stack),也可直接稱棧。在電腦科學中,棧是一種特殊的串列形式的資料結構,它的特殊之處在於只能允許在鏈結串列或陣列的一端(稱為堆棧頂端指標,英文為top)進行加入資料(push)和輸出資料(pop)的運算。
另外堆棧也可以用一維陣列或連結串列的形式來完成。
由於堆棧資料結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。
堆棧資料結構使用兩種基本操作:推入(push)和彈出(pop)。
標頭檔
#ifndef sq_stack_h#define sq_stack_h#define STACK_INIT_SIZE 10 //初始棧的最大長度#define STACKINCREMENT 10 //每次新增的棧的長度template <class DataType>class sq_stack{public: sq_stack(); void Push(DataType e); //插入為e的新棧頂元素 void Pop(); //刪除棧頂元素 DataType Top(); //取出棧頂元素 bool Empty(); //判斷棧是否為空白:空返回1 ~sq_stack(); //棧被銷毀private: DataType *base; //棧尾 DataType *top; //棧頂 int stacksize;};#endif
源檔案以及測試代碼
#include "sq_stack.h"#include <iostream>using namespace std;template <class DataType>sq_stack<DataType>::sq_stack(){ base = new DataType[STACK_INIT_SIZE]; if(!base) exit(1); top=base; stacksize=STACK_INIT_SIZE;}template <class DataType>void sq_stack<DataType>::Push(DataType e){ if(top-base>=stacksize-1){ base=(DataType*)realloc(base,(stacksize+STACKINCREMENT)*sizeof(DataType)); if(!base) exit(1); top=base+stacksize-1; stacksize+=STACKINCREMENT; } *top++=e;}template <class DataType>void sq_stack<DataType>::Pop(){ if(top==base) exit(1); top--;}template <class DataType>DataType sq_stack<DataType>::Top(){ if(top==base) return NULL; return *(top-1);}template <class DataType>bool sq_stack<DataType>::Empty(){ return top==base? 1:0;}template <class DataType>sq_stack<DataType>::~sq_stack(){ if(base) free(base); top = base = NULL; stacksize = 0;}int main(){ sq_stack<int> st; for(int i=1;i<=20;i++) st.Push(i); for(int i=1;i<=20;i++) { cout<<st.Top()<<" "; st.Pop(); if (i%5 == 0){cout<<endl;} } system("pause"); return 0;}