链式栈本质是链表,只是用链表实现栈特性。
一般操作有:创建栈、栈空、清除、入栈、出栈、释放、取栈顶。
插入删除都是在表头进行,所以表头是栈顶(头指针即栈顶指针),表尾是栈底。
定义链表(栈)节点,参考代码如下:
typedef int datatype;
typedef struct node
{
datatype data;
struct node * next;
}listnode, * linklist;
栈的特性操作接口如下:
linklist linkstack_create() //创建栈
{
linklist s;
if((s = (linklist)malloc(sizeof(listnode))) == NULL)
{
printf("malloc failed!\n");
return NULL;
}
s->next = NULL;
return s;
}
int linkstack_empty(linklist s) //判断栈是否为空
{
if(s->next == NULL)
return 1;
else
return 0;
}
int linkstack_push(linklist s,datatype value) //入栈
{ //和单链表的头插入一样的操作
linklist p;
if((p = (linklist)malloc(sizeof(listnode))) == NULL)
{
printf("malloc failed!\n");
return -1;
}
p->next = s->next;
s->next = p;
p->data = value;
return 0;
}
datatype linkstack_pop(linklist s) //出栈
{ // 删除头节点 显示头节点的数据
linklist p;
datatype ret;
p = s->next;
s->next = p->next;
ret = p->data;
free(p);
p = NULL;
return ret;
}
datatype linkstack_top(linklist s) //取栈顶 如果为空不会调用此函数
{
return s->next->data;
}
void linkstack_clear(linklist s) //清栈 不删头节点
{
linklist p;
p = s->next;
while(p!=NULL)
{
s->next = p->next;
free(p);
p = s->next;
}
puts("");
}
void linkstack_free(linklist s) //连头节点都删除
{
linklist p;
p = s;
while(p!=NULL)
{
s = s->next;
free(p);
p = s;
}
}
反思:
主要是了解栈的特性,用链表来实现并不算难,要注意链式栈一般不考虑栈满。