鏈棧是借用單鏈表實現的棧。其不同於順序棧之處在於:
1、鏈棧的空間是程序運行期間根據需要動態分配的,機器內存是它的上限。而順序棧則是
靜態分配內存的。
2、鏈棧動態分配內存的特性使得它一般無需考慮棧溢出的問題。
鏈棧的的組織結構如下圖所示。容易發現其是架構的單鏈表的基礎之上的。
下面介紹下我用C++實現的鏈棧,VC6下調試。
1、文件的組織結構
2、ls.h鏈棧類的說明
#ifndef _LS_H_ #define _LS_H_ typedef int dataType; struct node //鏈棧節點 { dataType data; //數據域 node *next; //指針域 }; class ls { public: ls(); ~ls(); void push(dataType var); //壓棧 void pop(); //出棧.出棧之前並不判斷棧是否已空.需要通過isEmpty()判斷 dataType stackTop(); //取棧頂元素,棧頂無變化.不提前判斷棧是否為空 bool isEmpty(); //判空.空返回true,反之返回false //bool isFull(); //判滿.鏈棧是動態分配內存空間的,無需判滿 private: node *top; //棧頂指針.top=NULL表示為空棧 }; #endif
3、ls.cpp鏈棧類成員函數的定義
#include <iostream> #include "ls.h" using namespace std; ls::ls() { top = NULL; //top=NULL表示鏈棧為空 } ls::~ls() { node *ptr = NULL; while(top != NULL) //循環釋放棧節點空間 { ptr = top->next; delete top; top = ptr; } } void ls::push(dataType var) { node *ptr = new node; ptr->data = var; //新棧頂存值 ptr->next = top; //新棧頂指向舊棧頂 top = ptr; //top指向新棧頂 } void ls::pop() { node *ptr = top->next; //預存下一節點的指針 delete top; //釋放棧頂空間 top = ptr; //棧頂變化 } dataType ls::stackTop() { return top->data; //返回棧頂元素,並不判斷棧是否已空 } bool ls::isEmpty() { return top == NULL; //棧頂為NULL表示棧空 }
4、main.cpp
#include <iostream> #include "ls.h" using namespace std; int main() { ls exp; int i = 0; for(i=0;i<3;++i) { exp.push(i); } for(i=0;i<3;i++) { if(!exp.isEmpty()) { cout<<exp.stackTop()<<endl; exp.pop(); } } return 0; }