棧的鏈式存儲,就像一個鏈表一樣,但是不能訪問棧內元素,只能訪問棧頂元素。每個節點有兩個區域一個是數據域,另一個是指針域,指向棧頂的下一個元素。鏈棧的存儲大概是這個樣子的。
下面是代碼實現,跟鏈表類似:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode,*LiStack;
void InitStack(LiStack &S); //構造一個鏈棧
bool StackEmpty(LiStack S); //判斷是否棧爲空
void StackPush(LiStack &S,ElemType x); //向棧頂插入一個元素
void StackPop(LiStack &S,ElemType &x); //出棧操作
void GetTop(LiStack S,ElemType &x); //獲取棧頂元素
bool ClearStack(LiStack &S); //清空棧,銷燬內存
int main()
{
int n,num,x;
LiStack S;
InitStack(S);
cin >> n;
while(n--){
cin >> num;
StackPush(S,num);
}
cout << "棧是否爲空: " << StackEmpty(S) << endl;
while(!StackEmpty(S)){
GetTop(S,x);
cout << x << " ";
StackPop(S,x);
}
cout << emd;
cout << "棧是否爲空:" << StackEmpty(S) << endl;
return 0;
}
void InitStack(LiStack &S){ //構造一個新的棧,申請內存
S=new LinkNode; //C++申請內存
S->next=NULL;
}
bool StackEmpty(LiStack S){
if(S->next==NULL)
return true;
else
return false;
}
void StackPush(LiStack &S,ElemType x){
LinkNode *top; //聲明棧頂指針
top=(LiStack)malloc(sizeof(LinkNode)); //C申請內存
top->data=x;
top->next=S;
S=top;
return ;
}
void StackPop(LiStack &S,ElemType &x){ //出棧操作
LiStack top;
x=S->data;
top=S;
S=S->next; //出棧
free(top); //釋放棧頂內存
}
void GetTop(LiStack S,ElemType &x){
x=S->data;
}
bool ClearStack(LiStack &S){
if(S==NULL)
return false;
LiStack top;
while(S!=NULL){
top=S;
S=S->next;
free(top);
}
return true;
}