今天我们要学习栈实现的第二种办法---链栈。
1.结构体设计
2.各个功能的实现
3.思考题
结构体的设计
#pragma once
#pragma once
typedef int ELEM_TYPE;
typedef struct LStack
{
ELEM_TYPE data;//数据域
struct LStack* next;//指针域
}LStack, * PLStack;
基本操作
上篇说道栈是后进先出,但是我们要考虑栈不同顺序结构的对应的时间复杂度,顺序栈的尾插,尾删的时间复杂度都为O(1);而在链表当中则不是,尾插,尾删都要从头结点开始遍历一次,而头插和头删则较容易操作,即O(1);所以小白是用头插,头删实现链栈。
初始化
void Init_LStack(struct LStack* ls) {
assert(ls != NULL);
ls->next = NULL;
}
入栈
//入栈(相当于单链表的头插)考虑时间复杂度,头插O(1)
bool Push(struct LStack* ls, ELEM_TYPE val) {
assert(ls != NULL);
struct LStack* pnewnode = (struct LStack*)malloc(sizeof(struct LStack));
assert(pnewnode != NULL);
pnewnode->data = val;
pnewnode->next = ls->next;
ls->next = pnewnode;
return true;
}
出栈
//出栈(相当于单链表的头删)
bool Pop(struct LStack* ls) {
assert(ls != NULL);
if (Is_Empty(ls))
{
return false;
}
struct LStack* p = ls->next;
ls->next = p->next;
free(p);
return true;
}
获取栈顶元素
因为上面入栈的是使用头插方法,刚进去的元素吼出来,所以获取栈顶元素就是我们最后输入的那个元素
//获取栈顶元素值 //获取栈顶的元素值,但是不删除
ELEM_TYPE Top(struct LStack* ls) {
assert(ls != NULL);
if (Is_Empty(ls))
{
return false;
}
return ls->next->data;
}
判空
bool Is_Empty(struct LStack* ls) {
assert(ls != NULL);
return ls->next == NULL;
}
搜索
//搜索
struct LStack* Search(struct LStack* ls, ELEM_TYPE val) {
assert(ls != NULL);
struct LStack* p = ls->next;
for (; p != NULL; p = p->next) {
if (p->data == val) {
return p;
}
}
return NULL;
}
清空&&销毁
//清空
void Clear(struct LStack* ls) {
assert(ls != NULL);
Destroy(ls);
}
//销毁
void Destroy(struct LStack* ls) {
assert(ls != NULL);
struct LStack* p = ls;
struct LStack* q;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
}
打印
这里注意我们使用的是头插法,最先进去的元素进入栈底,当我们输出栈中元素时是从栈顶到栈尾,所以与顺序栈不同的一点就是输出的元素是反着的
//打印
void Show(struct LStack* ls) {
assert(ls != NULL);
struct LStack* p = ls->next;
for (; p != NULL; p = p->next) {
printf("%d", p->data);
}
printf("\n");
}
获取有效值个数
//获取有效值个数
int Get_length(struct LStack* ls) {
assert(ls != NULL);
struct LStack* p = ls->next;
int count = 0;
for (; p != NULL; p = p->next) {
count++;
}
return count;
}
okk栈的学习我们就告一段落,有兴趣的朋友可以想想如何逆置链表(就是使用今天这篇文章的内容),后续内容敬请期待。小可爱们记得一键三连。