//链栈的基本知识和使用
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
#define StackElemType int//自定义链栈的数据类型,方便修改
//链栈的定义
typedef struct node{
StackElemType data;
struct node *next;
}LinkStacknode;//自定义链栈结点
typedef LinkStacknode *LinkStack;//这里面我的理解是上面是自定义数据类型的一种链栈的结点。LinkStack S即为一个指针变量
// 而用这种数据类型再定义另一种数据类型的指针,这种指针用来定义的一个变量就是一个链栈。是不是可以理解为地址的地址就是这个元素本身
//链栈的初始化
void InitLinkStack(LinkStack S){
S->next = NULL;
}//这个很简单
//链栈的进栈操作,和出栈的操作一样,变量需要做出改变并传回改变后的变量,所以需要使用指针变量
int Push(LinkStack S, StackElemType x){//将元素x压入链栈S中
LinkStacknode *p;//定义一个结点,因为需要压入栈
p = (struct node *)malloc(sizeof (struct node));//为这个结点申请空间
if(p == NULL){//这里做的是倘若分配内存空间失败,但是一般不会出现在这种情况,个人认为不写的话因该不会出现错误
return false;
} else{
p->data = x;//为结点赋值
//这里面人有两种写法,我思考了很久,依旧是我之前指出来的点,我们讨论的依旧是有头结点的链栈,所以下面这句话才得以实现
//因为头结点永远在栈顶
//永远为空
p->next = S->next;
S->next = p;//替换S
return true;
}
}
//链栈的出栈操作
int Pop(LinkStack S, StackElemType *x){
LinkStacknode *p;
if(S->next == NULL){
return false;//空栈无法出栈
} else{
p->next = S->next;
*x = S->next->data;//元素带出
free(p);//出栈操作
return true;
}
}
//主函数可以用来测试功能
int main() {
return 0;
}
链栈的基本使用
最新推荐文章于 2022-03-20 20:30:13 发布