链栈的操作和单链表差不多,入栈操作就相当于单链表的结点前插,出栈的操作就相当于结点前删。
单链表复习
链接: 单链表的简单实现.
基本操作
入栈
// 入栈(结点头插)
bool Push(LiStack S, ElemType e){
LinkNode *p = (LinkNode*)malloc(sizeof(LinkNode));
if(S->next == NULL){
// 判断栈空
// 先创建第一个结点
p->data = e;
p->next = NULL; // 后继指向空
S->next = p;
}else{
// 后续结点都是在头结点和第一个结点之间插入
p->next = S->next; // p指向头指针原后继
p->data = e; // 存入数据
S->next = p; // 头指针后继指向p
}
return true;
}
创建栈
// 创建栈
bool CreateStack(LiStack S){
ElemType e;
scanf("%d", &e); // 读入数据
while(e != 9999){
// 输入9999停止
Push(S, e); // 调用入栈函数进行入栈
scanf("%d", &e); // 读入数据
}
return true;
}
出栈
// 出栈
bool Pop(LiStack S, ElemType *e){
if(S == NULL || S->next == NULL) return false;
LinkNode *p = S->next;
S->next = p->next; // 指向下一个结点
free(p);
return true;
}
读取栈顶元素
// 读取栈顶元素
bool GetTop(LiStack S, ElemType