栈的链式存储结构及实现
栈的链式存储结构:链栈
基本上不存在栈满的情况,栈满意味着内存满了,这时候电脑会死机
栈顶指针和头指针合二为一
链栈结构代码
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
进栈
先给新元素e分配一个新结点S,结点S的数据域存储e,结点S的指针域指向当前的栈顶元素的指针域,然后把这个新结点S赋给栈顶。
代码实现
/*输入元素e为新的栈顶元素*/
Status Push(LinkStack *S,SElemType e)
{
LinkStackPtr s= (LinkStackPtr)malloc (sizeof (StackNode));//创建新结点
s->data=e;
s->next=S->top;//把当前的栈顶元素赋值给新结点的直接后继
S->top=s;//将新的结点S赋值给栈顶指针
S->count++;
return OK;
}
出栈
把结点先用变量p存起来,将栈顶指针下移一位,最后释放p即可。
/*若栈不空,则删除S的栈顶元素,yomge返回其值,并返回OK;否则返回ERROR*/
Status Pop (LinkStack *S,SElemType *e)
{
LinkStackPtr p;
if (StackEmpty(*S))
return ERROR;
*e=S->top->data;
p=s->data;//将栈顶结点赋值给p
S->top=S->top->next;//栈顶指针下移一位,指向后一结点
free(p);//释放结点
S->count--;
return OK;
}