数据结构–链栈
根据栈的定义,和链表结合
利用链表的头插法实现入栈,利用链表删除头元素的方法实现出栈
定义结构体
//定义链栈
typedef struct Linknode{
elemtype data;
Linknode *next;
}*ListStack;
对栈进行初始化
//初始化
void initStack(ListStack &S){
S=(ListStack)malloc(sizeof(Linknode));//创建头节点
S->next=NULL;//指向空
}
判断栈是否为空:
//判栈空
bool StackEmpty(ListStack &S){
if(S->next==NULL)
return true;
else
return false;
}
入栈
bool Push(ListStack &S,elemtype x){
Linknode *q,*p;
p=S; //指向S栈
q=(Linknode*)malloc(sizeof(Linknode));//分配一个节点
q->data=x;
q->next=p->next;
p->next=q;
return true;
}
出栈
//出栈
bool Pop(ListStack &S,ListStack &x){
if(StackEmpty(S)) //判栈空
return false;
ListStack p;
p=S->next;
S->next=p->next;
x=p;
free(p);//释放P结点的内存
return true;
}
读栈顶元素
//读栈顶元素
bool GetTop(ListStack &S,ListStack &x){
if(StackEmpty(S)) //判断是否为空栈
return false;
x=S->next; //用x将栈顶元素的信息带回
return true;
}
完整代码:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int elemtype;
//定义链栈
typedef struct Linknode{
elemtype data;
Linknode *next;
}*ListStack;
//初始化
void initStack(ListStack &S){
S=(ListStack)malloc(sizeof(Linknode));//创建头节点
S->next=NULL;//指向空
}
//判栈空
bool StackEmpty(ListStack &S){
if(S->next==NULL)
return true;
else
return false;
}
//进栈
bool Push(ListStack &S,elemtype x){
Linknode *q,*p;
p=S; //指向S栈
q=(Linknode*)malloc(sizeof(Linknode));//分配一个节点
q->data=x;
q->next=p->next;
p->next=q;
return true;
}
//出栈
bool Pop(ListStack &S,ListStack &x){
if(StackEmpty(S)) //判栈空
return false;
ListStack p;
p=S->next;
S->next=p->next;
x=p;
free(p);//释放P结点的内存
return true;
}
//读栈顶元素
bool GetTop(ListStack &S,ListStack &x){
if(StackEmpty(S)) //判断是否为空栈
return false;
x=S->next; //用x将栈顶元素的信息带回
return true;
}
void main(){
ListStack S;
Linknode *x;
elemtype v;
int i;
initStack(S);//初始化栈
for(i=0;i<=5;i++){
cin>>v;
Push(S,v);
}
for(i=0;i<=5;i++){
GetTop(S,x);
cout<<x->data<<endl;//输出栈顶元素
Pop(S,x);
}
}
测试结果: