鏈棧是借用單鏈表實現的棧。其不同於順序棧之處在於:
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;
}
