当前位置: 首页 > news >正文

数据结构——受限线性表之栈

引入:

各位小伙伴大家好,前几期我们分享了数据结构中的线性表(顺序表和链表),然后学习了双指针法,最后练习了几道经典练习题。从现在开始我们学习一些新的内容,也就是栈。

栈:

定义:

栈是限定仅在表尾进行插入或删除的线性表。表尾称为栈顶,表头端称为栈底,不含元素的空表称为空栈。设Stack=(a1,a2,……an),a1为栈底元素,an为栈顶元素,元素按照从a1到an的顺序依次进栈,但是退栈的第一个元素是栈顶也即是an。栈的修改按照先进后出、后进先出的原则,因此栈又称为先进后出(FILO)线性表。

也就是说,栈是限制插入和删除操作只能在一个位置进行(栈顶)的表。

对栈的基本操作包括进栈(push)和出栈(pop)等。

栈的顺序结构的实现:

定义:

typedef int ElemType;
typedef struct{ElemType data[MAXSIZE];int top; 
}Stack;

初始化:

void initStack(Stack *S)
{S->top=-1;
}

判断栈是否为空:

bool IsEmpty(Stack *S)
{if(S->top==-1) {printf("栈为空\n");return 1;}else return 0;
}

压栈:

bool PushStack(Stack *S,ElemType e)
{if(S->top>=MAXSIZE-1){printf("栈满了\n");return 0;}else{S->top+=1;S->data[S->top]=e;return 1;	}	
}

出栈:

bool PopStack(Stack *S,ElemType e)
{if(S->top==-1){printf("空栈\n");return 0;}else{e=S->data[S->top];S->top-=1;return 1;}
}

获取栈顶元素:

ElemType GetPop(Stack *S,ElemType e)
{if(S->top==-1){printf("这是空栈\n");return 0;}e=S->data[S->top];return e;	
} 

总结代码和注释:

#include<stdio.h> 
#define MAXSIZE 100
typedef int ElemType;
typedef struct{ElemType data[MAXSIZE];int top; 
}Stack;
void initStack(Stack *S)
{S->top=-1;
}
bool IsEmpty(Stack *S)
{if(S->top==-1) {printf("栈为空\n");return 1;}else return 0;
}//栈为空返回1.有内容返回0
bool PushStack(Stack *S,ElemType e)
{if(S->top>=MAXSIZE-1){printf("栈满了\n");return 0;}else{S->top+=1;S->data[S->top]=e;return 1;	}	
}
bool PopStack(Stack *S,ElemType e)
{if(S->top==-1){printf("空栈\n");return 0;}else{e=S->data[S->top];S->top-=1;return 1;}
}
ElemType GetPop(Stack *S,ElemType e)
{if(S->top==-1){printf("这是空栈\n");return 0;}e=S->data[S->top];return e;	
} 
int main()
{int result=0;Stack stack;initStack(&stack);IsEmpty(&stack);PushStack(&stack,10);PushStack(&stack,20);PushStack(&stack,30);printf("%d\n",GetPop(&stack,result));PopStack(&stack,result);printf("%d\n",result);printf("%d\n",GetPop(&stack,result));return 0;
}

动态内存分配的总代码和注释:

#include<stdio.h> 
#include<stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct{ElemType *data;//这里是用指针定义的int top; 
}Stack;
Stack* initStack()
{Stack* S=(Stack*)malloc(sizeof(Stack));S->data=(ElemType*)malloc(sizeof(Stack)*MAXSIZE);S->top=-1;return S;//动态内存分配
}
bool IsEmpty(Stack *S)
{if(S->top==-1) {printf("栈为空\n");return 1;}else return 0;
}
bool PushStack(Stack *S,ElemType e)
{if(S->top>=MAXSIZE-1){printf("栈满了\n");return 0;}else{S->top+=1;S->data[S->top]=e;return 1;	}	
}
bool PopStack(Stack *S,ElemType e)
{if(S->top==-1){printf("空栈\n");return 0;}else{e=S->data[S->top];S->top-=1;return 1;}
}
ElemType GetPop(Stack *S,ElemType e)
{if(S->top==-1){printf("这是空栈\n");return 0;}e=S->data[S->top];return e;	
} 
int main()
{int result=0;Stack *stack=initStack();//创建和初始化方式发生了变化IsEmpty(stack);PushStack(stack,10);PushStack(stack,20);PushStack(stack,30);printf("%d\n",GetPop(stack,result));PopStack(stack,result);printf("%d\n",result);printf("%d\n",GetPop(stack,result));return 0;
}

栈的链式结构:

定义:

typedef struct stack{ElemType data;struct stack* next;
}Stack;//创建栈 
Stack* initStack()
{Stack* S=(Stack*)malloc(sizeof(Stack));S->next=NULL;return S;	
}//初始化栈 

总代码和注释:

#include<stdio.h> 
#include<stdlib.h>
typedef int ElemType;
typedef struct stack{ElemType data;struct stack* next;
}Stack;//创建栈 
Stack* initStack()
{Stack* S=(Stack*)malloc(sizeof(Stack));S->next=NULL;return S;	
}//初始化栈 
bool IsEmpty(Stack* S)
{if(S->next==NULL){printf("栈为空\n");return 1;}else return 0;
}//判断栈是否为空
bool PushStack(Stack* S,ElemType e)
{Stack* node=(Stack*)malloc(sizeof(Stack));node->data=e;node->next=S->next;S->next=node;
}//压栈,采用头插法
bool PopStack(Stack* S)
{if(IsEmpty(S)){return 0;}else{Stack* q=S->next;S->next=q->next;free(q);}	
} //出栈
int GetPop(Stack* S,ElemType e)
{if(IsEmpty(S)){return 0;}else{e=S->next->data;printf("%d\n",e);return e;}
} //获取栈顶元素 
void FreeStack(Stack* S)
{while(S->next!=NULL){Stack *q=S->next;S->next=q->next;free(q);}
}//释放我们给栈分配的堆内存 
int main()
{int result=0;Stack* stack=initStack();IsEmpty(stack);PushStack(stack,10);PushStack(stack,20);PushStack(stack,30);GetPop(stack,result);PopStack(stack);GetPop(stack,result);FreeStack(stack);return 0;
}

 

总结:

今天我们主要分享了栈的基础知识。明天我们继续学习队列,期待一下吧。好了,今天就到这里啦!

 

 


 

http://www.dtcms.com/a/394788.html

相关文章:

  • 数据结构(1)------ 三要素
  • BaaS(Backend as a Service)概述、平台、项目
  • 区间dp,数据结构优化dp等5种dp,各种trick深度讲解
  • 数据结构笔试选择题:题组1
  • 前端基础:从0到1实现简单网页效果(一)
  • 数据结构|图论:从数据结构到工程实践的核心引擎
  • AI赋能个人效能提升:实战演练工作规划、项目复盘与学习发展
  • 7. Linux RAID 存储技术
  • iOS 上架 App 费用详解 苹果应用发布成本、App Store 上架收费标准、开发者账号与审核实战经验
  • kafka 2.12_3.9.1 版本修复 Apache Commons BeanUtils 访问控制错误漏洞(CVE-2025-48734)
  • 二分查找经典——力扣153.寻找旋转排序数组中的最小值
  • 离散数学之命题逻辑
  • 【Linux命令从入门到精通系列指南】ping 命令详解:网络连通性诊断的终极工具
  • 游戏UI告别“贴图”时代:用Adobe XD构建“活”的设计系统
  • NXP - 用MCUXpresso IDE导入lpcopen_2_10_lpcxpresso_nxp_lpcxpresso_1769.zip中的工程
  • ✅ Python+Django租房推荐系统 双协同过滤+Echarts可视化 租房系统 推荐算法 全栈开发(建议收藏)✅
  • Django入门-3.公共视图
  • 【 设计模式 | 结构型模式 代理模式 】
  • 小杰机器学习高级(five)——分类算法的评估标准
  • IS-IS 中同时收到 L1 和 L2 的 LSP 时,是否优选 L1
  • 【开源】基于STM32的智能车尾灯
  • 电子电气架构 --- 软件开发与产品系统集成流程(下)
  • Ubuntu系统目录架构是怎么样的
  • 自动驾驶仿真之“场景交互”技术研究
  • 《AI管家还是数字化身?—— 一种面向未来的个人智能架构构想》
  • AI提升工业生产制造安全,基于YOLOv9全系列【yolov9/t/s/m/c/e】参数模型开发构建工业生产制造加工场景下工业设备泄漏智能化检测识别预警系统
  • 深度学习(十一):深度神经网络和前向传播
  • js立即执行函数的几种写法
  • RecyclerView里更新列表数是不想让header也刷新,怎么处理
  • C#/.NET/.NET Core技术前沿周刊 | 第 55 期(2025年9.15-9.21)