对于链表来说,若每次在最后一个节点进行操作时,时间复杂度为O(n),但是在头节点后面进行操作时间复杂度仅为O(1),因此可以得出链式栈的基本结构。
typedef struct LStack
{
int data;
LStack* next;
}Lstack,*PLstack;
3、头文件
#pragma once
typedef int ELEM_TYPE;
typedef struct LStack
{
int data;
LStack* next;
}Lstack,*PLstack;
//购买节点
PLstack Buynode();
//初始化
void Init_Stack(PLstack ps);
//入栈
bool Push(PLstack ps, ELEM_TYPE val);
//出栈(出栈成功,返回出栈元素的值,不成功的话无所谓)
bool Pop(PLstack ps, ELEM_TYPE* rtval);//rtval是输出参数,帮助函数返回其他信息
//获取栈顶元素
bool Top(PLstack ps, ELEM_TYPE* rtval);
//获取有效数据个数
int Get_length(PLstack ps);
//判空
bool Is_Empty(PLstack ps);
//清空
void Clear(PLstack ps);
//销毁
void Destory(PLstack ps);
//打印
void Print(PLstack ps);
4、函数实现
#include"linkstack.h" #include5、运行结果展示#include #include //购买节点 PLstack Buynode() { PLstack s = (PLstack)malloc(sizeof(LStack)); if (s == NULL) { return NULL; } return s; } //初始化 void Init_Stack(PLstack ps) { assert(ps != NULL); ps->next = NULL; } //入栈(相当于链表头插) bool Push(PLstack ps, ELEM_TYPE val) { assert(ps != NULL); PLstack s = Buynode();//为要入栈数申请一个节点 s->next = ps->next;//先链右再链左 ps->next = s; s->data = val; return true; } //出栈(出栈成功,返回出栈元素的值,不成功的话无所谓)相当于链表的头删 bool Pop(PLstack ps, ELEM_TYPE* rtval)//rtval是输出参数,帮助函数返回其他信息 { assert(ps != NULL); if (Is_Empty(ps)) { return false; } PLstack p = ps->next;//用于存放要出栈的节点 *rtval = p->data;//用输出参数将要出栈节点的data值保存起来 ps->next = p->next;//将 free(p); p = NULL; return true; } //获取栈顶元素 bool Top(PLstack ps, ELEM_TYPE* rtval) { assert(ps != NULL); if (Is_Empty(ps)) { return false; } *rtval = ps->next->data; return true; } //获取有效数据个数 int Get_length(PLstack ps) { assert(ps != NULL); int length = 0; PLstack p = ps->next; while (p != NULL) { length++; p = p->next; } return length; } //判空 bool Is_Empty(PLstack ps) { assert(ps != NULL); if (ps->next == NULL) { return true; } return false; } //清空 void Clear(PLstack ps) { assert(ps != NULL); ps->next = NULL; } //销毁 void Destory(PLstack ps) { assert(ps != NULL); ps->next = NULL; free(ps); ps = NULL; } //打印 void Print(PLstack ps) { assert(ps != NULL); int length = Get_length(ps); PLstack p = ps->next;//将第一个有效节点赋值给p for (int i = 0; i < length; i++) { printf("%d ", p->data); p = p->next; } } int main() { LStack x = {}; PLstack ps = &x; Init_Stack(ps); for (int i = 0; i < 10; i++) { Push(ps, i); } Print(ps); printf("n"); int a = 0; for (int i = 0; i < 10; i++) { Pop(ps, &a); printf("%d ", a); } printf("n"); printf("%d ",Is_Empty(ps)); printf("n"); }



