软考:数据结构基础——栈
我们实现了可以动态增加栈大小的动态栈
并对realloc 函数的使用方法回顾了一下
一、栈的定义
1.栈是只能访问它的一端来实现数据的储存和检索的一种线性结构,他是一种LIFO(Last In First Out)先进先出的线性表。插入和删除的一端叫做栈顶(TOP),另一端叫做栈底(Botton)。
2.栈的基本操作
1)初始化 init(S) 返回一个空栈
2)判断空
3)入站PUsh
4)出栈Pop
5) 返回栈顶元素
、
3.栈的应用
(1)用于表达式求值,括号匹配,转化递归过程为非递归过程的处理
· ·(2)链式的栈,使用链式结构储存的栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 //栈结构体,由栈顶标志 top 和 栈空间组成 //这里是有一片存放int的内存 用*base 指向,应用 base[i] 访问 typedef struct stack{ int *base; int top; } Stack; //给这个空间分配MAX_SIZE*int大小的空间 //初始化 top = 0 void Init(Stack *s){ s->base = ( int *) malloc (MAX_SIZE * sizeof ( int )); s->top = 0; } //实现入栈 void Push( int data, Stack *s){ if (s->top>99){ //当栈满了的时候,使用realloc函数(<stdlib.h> 头文件中) //为这片空间重新分配一个更大的空间 //realloc(ptr*, size) 会将ptr内存空间中的数据复制到新空间中 //然后将s->base 指向这个新的内存空间 s->base = ( int *) realloc (s->base,2* sizeof ( int )*MAX_SIZE); } //s->base[s->top] 来获得base[i] 的数据 s->base[s->top] = data; //将标志top加1 s->top++; } //实现出栈 //出栈并没有消除出栈的数据,只是下次入栈时会将其覆盖 int Pop(Stack *s){ int data; if (s->top == 0){ //栈空时提示 printf ( "the stack is E\n" ); return ; } //这部操作将先将s->top -1 然后再返回 data = s->base[--s->top]; s->top; return data; } int main(){ Stack s; int i = 0; Init(&s); //我们入栈198个数据来检查是否为栈分配了新的内存 for (i;i<198;i++) Push(i,&s); for (i=198;i>0;i--){ printf ( "%d\n" ,Pop(&s)); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战