将链栈的头部作为栈顶就很方便了,而且不必设置头结点,每次插入都是将结点设置为栈顶元素,每次删除都是将栈顶元素删除。
具体实现如下:
创建一个空链栈:
void InitLinkStack(LinkStack S) //与其他链表不一样的是,这里不需要创建一个头结点
{
S=NULL;
}
入栈:
void Push(LinkStack &S,User user)
{
LinkStack p=(LinkStack)malloc(sizeof(StackNode)); //开辟一个新结点
p->user=user;
p->next=S; //将p插入到栈顶,作为新的栈顶元素
S=p; //将栈顶指针修改为p
}
出栈:
User Pop(LinkStack &S)
{
User user;
if(S==NULL)
{
user.id=-1;
strcpy(user.username,"error");
return user;
}
user=S->user;
LinkStack p=S;
S=S->next; //将栈顶指针下移一位
delete(p);
return user;
}
取出栈顶元素
User GetTop(LinkStack S)
{
if(S!=NULL)
{
return S->user;
}
}
这里提供一份完整源码:
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
char username[20];
int id;
}User;
typedef struct StackNode
{
User user;
struct StackNode *next;
}StackNode,*LinkStack;
//创建一个空链栈
void InitLinkStack(LinkStack S) //与其他链表不一样的是,这里不需要创建一个头结点
{
S=NULL;
}
//入栈
void Push(LinkStack &S,User user)
{
LinkStack p=(LinkStack)malloc(sizeof(StackNode)); //开辟一个新结点
p->user=user;
p->next=S; //将p插入到栈顶
S=p; //将栈顶指针修改为p
}
//出栈
User Pop(LinkStack &S)
{
User user;
if(S==NULL)
{
user.id=-1;
strcpy(user.username,"error");
return user;
}
user=S->user;
LinkStack p=S;
S=S->next; //将栈顶指针下移一位
delete(p);
return user;
}
//取出栈顶元素
User GetTop(LinkStack S)
{
if(S!=NULL)
{
return S->user;
}
}
int main()
{
LinkStack S;
User user;
//初始化链栈
InitLinkStack(S);
//入栈
user.id=0;
strcpy(user.username,"gjw");
Push(S,user);
//出栈
user=Pop(S);
cout<<user.id<<endl;
//取出栈顶元素
//user=GetTop(S);
//cout<<user.username<<endl;
return 0;
}
至此,链栈的基本操作就弄完了