数据结构之链表实现栈
# include <stdio.h>
# include <malloc.h>
# include <stdbool.h>
typedef struct Node{
int data;
struct Node * next;
} Node,* PNODE;
typedef struct Stack{
PNODE pTop;
PNODE pBottom;
} Stack ,* PSTACK;
void init(PSTACK);
void push(PSTACK,int);
void traverse_stack(PSTACK);
bool empty(PSTACK);
void pop(PSTACK);
void clear(PSTACK);
int main(void){
Stack stack;
init(&stack);
push(&stack,12);
push(&stack,33);
push(&stack,22);
push(&stack,55);
push(&stack,77);
traverse_stack(&stack);
printf("--------------\n");
pop(&stack);
pop(&stack);
traverse_stack(&stack);
clear(&stack);
printf("--------------\n");
traverse_stack(&stack);
printf("--------------\n");
return 0;
}
void init(PSTACK pS){
PNODE pNode= (PNODE)malloc(sizeof(Node));
pS->pTop=pNode;
pS->pBottom=pNode;
return;
}
void push(PSTACK pS,int val){
PNODE pNode= (PNODE)malloc(sizeof(Node));
pNode->data=val;
pNode->next=pS->pTop;
pS->pTop=pNode;
return;
}
bool empty(PSTACK pS){
if(pS->pBottom == pS->pTop){
return true;
}
return false;
}
// 开始来进行遍历
void traverse_stack(PSTACK pS){
if(empty(pS)){
printf("动态栈为空\n");
return;
}
PNODE tmp = pS->pTop;
while(tmp!=pS->pBottom){
printf("动态栈中对应的内容是:%d\n",tmp->data);
tmp=tmp->next;
}
return;
}
// 出栈操作
void pop(PSTACK pS){
if(empty(pS)){
printf("当前栈为空\n");
return ;
}
// 开始修改对应的值
PNODE tmp = pS->pTop;
pS->pTop=tmp->next;
free(tmp);
tmp=NULL;
}
// 一直把握不住重点!
void clear(PSTACK pS){
if(empty(pS)){
printf("当前栈中已经是空的了\n");
return;
}else{
PNODE q;
// 只要当p在上面一个的时候,再次执行,就到了下一位,然后相等。所以还是指向了一个结点
while(pS->pTop!=pS->pBottom){
q=pS->pTop->next;
free(pS->pTop);
pS->pTop=q;
}
}
}
从理论中来,到实践中去,最终回归理论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?