采用链式存储的栈称为链栈,优点是便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。通常用单链表实现,并规定所有操作都是在单链表的表头进行的。
这里规定链栈没有头结点。
采用链式存储结构便于结点的插入与删除,链栈的操作和链表类似,入栈和出栈的操作都是链表的表头进行。
//栈的链式存储结构
#include<stdio.h>
#include<stdlib.h>
typedef struct LSNode{
int data;//数据域
struct LSNode *next;//指针域
}LSNode,*LinkStack;
//这里规定链栈没有头结点
void InitStack(LinkStack &s){
s=NULL;
}
bool StackEmpty(LinkStack s){
return s==NULL;
}
bool Push(LinkStack &s,int x){
if(s==NULL){//空栈 则此时入栈即为第一个元素
s=(LinkStack)malloc(sizeof(LSNode));
s->data=x;
s->next=NULL;
return true;
}
LSNode *p=(LSNode *)malloc(sizeof(LSNode));
if(p==NULL){
printf("p==NULL\n");
return false;
}
//偷天换日 用后插的方法来实现前插,即实现入栈
p->data=s->data;
p->next=s->next;
s->next=p;
s->data=x;
return true;
}
bool Pop(LinkStack &s,int &x){
if(s==NULL){
printf("s==NULL\n");
return false;
}
LSNode *p=s;
s=s->next;
x=p->data;
free(p);
p=NULL;
return true;
}
bool GetTop(LinkStack s, int &x){
if(s==NULL){
printf("空栈\n");
return false;
}
x=s->data;
return true;
}
bool DestroyStack(LinkStack &s){
if(s==NULL){
printf("栈不存在,无法销毁\n");
return false;
}
LSNode*p=s;
while(p!=NULL){
s=s->next;
free(p);
p=s;
}
p=NULL;
return true;
}
bool PrintStack(LinkStack s){
if(s==NULL){
printf("空栈,无法print\n");
return false;
}
printf("\nStack is: ");
LSNode *p=s;
while(p){
printf("%d ",p->data);
p=p->next;//@@@
}
printf("\n");
return true;
}
int main(){
LinkStack s;
InitStack(s);
for(int i=1;i<8;i++){
Push(s,i);
}
printf("after push:");
PrintStack(s);
int e;
Pop(s,e);
printf("pop element %d\n",e);
printf("after pop:");
PrintStack(s);
DestroyStack(s);
if(StackEmpty(s)){
printf("after destroy:Stack Empty\n");
}
}