栈的链式存储结构
链表的头指针指向空,那么链栈的空就是top=NULL
建立一个链栈的基本代码:
typedef struct Node
{
int data;
struct Node *next;
}stackNode,*Linkstackptr;
typedef struct Linkstack
{
Linkstackptr top;
int count;
}Linkstack;
链栈和链表类似,链栈的操作也和单链表相同。
进栈操作:把新插入的值赋给栈顶的结点,把之前的栈顶结点的更新。
void push(Linkstack *s,int e)
{
Linkstackptr p=(Linkstackptr)malloc(sizeof(stackNode));
p->data=e;//把e赋值给p
p->next=s->top;//把当前的栈顶元素赋值给新节点
s->top=p;//将新节点p赋值给栈顶指针。
s->count++;//栈顶位置+
}
出栈操作:因为栈的先进后出原则,先将栈顶的元素赋给下一个结点,然后再将栈顶出栈,栈顶更新。
void 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--;
}
栈的链式结构不存在栈满的情况,可以一直申请空间一直进栈。