辛苦手码不易, 如若有帮助烦请不吝收藏点赞 😃
张大壮考研碎碎念
主要是自己的408考研笔记, 因为WD的网课和书里会有不少需要自己动手写代码的部分, 所以就在这里予以记录, 不定时更新, 希望各位大牛不吝批评指正
数据结构
CH 3.1.3 栈的链式存储实现
这里WD书仅仅给出了链栈的定义方式, 要求学生参照对比单链表的形式给出实现方法, 这里实现如下:
//链栈的定义
typedef struct Linknode {
int data;//数据域
struct Linknode* next;//指针域
} *LiStack;//栈类型定义
/*********以下为带头节点*******************************************/
//链栈初始化
LiStack InitLiStack() {
LiStack L = (LiStack)malloc(sizeof(Linknode));// 创建头节点
L->next = NULL;//初始为空链表
return L;
}
//Push
bool PushLiStack(LiStack& L, int e) {
if (L == NULL)
return false;
LiStack S = (LiStack)malloc(sizeof(Linknode));
if (S == NULL)
return false;
S->data = e;
S->next = L->next;
L->next = S;
return true;
}
//Pop
bool PopLiStack(LiStack& L,int &e) {
if (L == NULL)
return false;
if (L->next== NULL)
return false;
if (L->next->next == NULL) {
e = L->next->data;
L->next=NULL;
free(L->next);
return true;
}
else{
LiStack p = L->next;
e = p->data;
L->next = p->next;
free(p);
return true;
}
}
//读取栈顶元素
bool GetTop(LiStack L,int &e) {
if (L == NULL)
return false;
if (L->next== NULL)
return false;
e = L->next->data;
return true;
}
//判空
bool IsEmpty(LiStack L){
if (L == NULL)
return false;
if (L->next== NULL)
return false;
else
return true;
}
//判满,本来就是链表的形式,如若不在头节点的data里计数的话,就只能靠遍历来获取节点数目了,那样就变成链表了,在这里判满无意义
/*****************以下为不带头结点(王道推荐)***************/
//链栈的定义
typedef struct Linknode {
int data;//数据域
struct Linknode* next;//指针域
} *LiStack;//栈类型定义
//Push
bool PushLiStack(LiStack& top, int e) {
//assert(top);//限制头指针要么指向NULL,要么不为NULL
LiStack S = (LiStack)malloc(sizeof(Linknode));//创建新节点
if (S == NULL)
return false;
LiStack cur=top;
S->data = e;
S->next = cur;
top = S;
return true;
}
//Pop
bool PopLiStack(LiStack& top,int &e) {
if (top == NULL)
return false;
if (top->next == NULL) {
free(top);
top=NULL;
return true;
}
else {
LiStack p = top;
e = p->data;
top = p->next;
free(p);
p=NULL;
return true;
}
}
//读取栈顶元素
bool GetTop(LiStack top,int &e) {
if (top == NULL){
return false;
}
else
e = top->data;
return true;
}
//判空
bool IsEmpty(LiStack top){
if (top == NULL)
return false;
else
return true;
}
void test(){
LiStack top = NULL;
PushLiStack(top, 1);
}
相较而言, WD推荐的不带头结点的实现方法确实是更加简单, 但是我个人实现起来, 会更加中意带头结点的实现方式, 感觉逻辑会更加清楚一些
代码若有谬误或是能更加精简的地方还请大家不吝指正 😃