栈的链式存储结构,简称为链栈。
栈是栈顶来做插入和删除操作,由于单链表有头指针,而栈顶指针也是必须得,所以比较好的办法是把栈顶放在单链表的头部。因为栈顶在头部,单链表中常用的头结点也就失去了意义,通常对于链栈来说。是不需要头结点的。如下图所示:
对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top=NULL。
链栈的结构代码如下:
typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct LinkStack { LinkStackPtr top; int count; }LinkStack;1.进栈操作
对于链栈的进栈push操作,假设元素值为e的新结点是s,top为栈顶指针,示意图如下:
代码实现如下:
int Push(LinkStack *S, SElemType e) { LinkStackPtr st = (LinkStackPtr)malloc(sizeof(StackNode)); st->data = e; st->next = S->top; //把当前的栈顶元素赋值给新结点的直接后继 S->top = st; //将新的结点st赋值给栈顶指针 S->count++; return OK; }2.出栈操作
链栈的出栈pop操作分为三步。假设变量p用来存储要删除的栈顶结点,将栈顶指针下移一位,最后释放p即可,如下图所示:
代码实现如下:
int Pop(LinkStack *S, SElemType *e) { LinkStackPtr p; *e = S->top->data; p = S->top; //将栈顶结点赋值给p S->top = S->top->next; //使得栈顶指针下移一位,指向后一结点 free(p); //释放结点p S->count--; return OK; }