栈的链式存储,就像一个链表一样,但是不能访问栈内元素,只能访问栈顶元素。每个节点有两个区域一个是数据域,另一个是指针域,指向栈顶的下一个元素。链栈的存储大概是这个样子的。
下面是代码实现,跟链表类似:
#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;
}