知识点:
链式栈,用带头结点的单链表实现
栈顶:入栈和出栈,栈顶在表头(入栈和出栈的时间复杂度都是O(1))
链式栈的栈顶在头指针,顺序栈的栈顶在最后面(尾部)
1.结构体
typedef struct LSNode
{
int data;
struct LSNode *next;
}LSNode,*PLStack;
2.初始化
void InitStack(PLStack ps)
{
assert(ps != NULL);
if(ps == NULL)
return ;
ps->next = NULL;
}
初始化测试:
LSNode s;
InitStack(&s);
3.入栈 往栈中输入数据(只能在栈顶操作)
bool Push(PLStack ps,int val)
{
assert(ps != NULL);
if(ps == NULL)
return false;
LSNode *p = (LSNode *)malloc(sizeof(LSNode));
assert(p != NULL);
p->data = val;
p->next = ps->next;
ps->next = p;
return true;
}
入栈测试:
LSNode s;
InitStack(&s);
for(int i = 0;i<13;i++)
{
Push(&s,i);
}
int val;
GetTop(&s,&val);
printf("%d\n",val);
4.获取栈顶元素的值(不删除栈顶元素) 输出参数
bool GetTop(PLStack ps,int *rtval)
{
assert(ps != NULL);
if(ps == NULL)
return false;
if(IsEmpty(ps))
{
return false;
}
*rtval = ps->next->data;
return true;
}
获取栈顶元素的值(不删除栈顶元素) 测试
LSNode s;
InitStack(&s);
for(int i = 0;i<13;i++)
{
Push(&s,i);
}
for(int i = 0;i<13;i++)
{
int val;
GetTop(&s,&val);
printf("%d ",val);
Pop(&s,&val);
}
5.获取栈顶元素的值并且删除栈顶元素
bool Pop(PLStack ps,int *rtval)
{
assert(ps != NULL);
if(ps == NULL)
return false;
if(IsEmpty(ps))
{
return false;
}
LSNode *p = ps->next;
*rtval = p->data;
ps->next = p->next;
return true;
}
获取栈顶元素的值并且删除栈顶元素 测试
LSNode s;
InitStack(&s);
for(int i = 0;i<13;i++)
{
Push(&s,i);
}
for(int i = 0;i<20;i++)
{
int val;
if(Pop(&s,&val))
{
printf("%d ",val);
}
else
break;
}
6.判空
bool IsEmpty(PLStack ps)
{
assert(ps != NULL);
if(ps == NULL)
return ;
return ps->next == NULL;
}
判空测试
LSNode s;
InitStack(&s);
if(IsEmpty(&s))
printf("是空链\n");
else
printf("不是空链\n");
7.获取栈中有效元素的个数
int GetLength(PLStack ps)
{
assert(ps != NULL);
if(ps == NULL)
return -1;
int count = 0;
for(LSNode *p = ps->next;p != NULL;p = p->next)
{
count++;
}
return count;
}
获取栈中有效元素的个数 测试
LSNode s;
InitStack(&s);
for(int i = 0;i<10;i++)
{
Push(&s,i);
}
int len = GetLength(&s);
printf("%d\n",len);
8.清空所有数据
void Clear(PLStack ps)
{
assert(ps != NULL);
if(ps == NULL)
return ;
Destroy(ps);
}
9.销毁数据
void Destroy(PLStack ps)
{
assert(ps != NULL);
if(ps == NULL)
return ;
LSNode *p;
while(ps->next != NULL)
{
p = ps->next;
ps->next = p->next;
free(p);
}
}