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

C语言栈的实现

C语言栈

//表示栈
typedef struct stack{int* arr;//存储区的首地址int top; //控制存和取的操作int cap; //存储区的容量
}stack_t;

思路:

入栈操作:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

中间都是重复的步骤,就省略了。

在这里插入图片描述
在这里插入图片描述

出栈操作:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

中间都是重复的步骤,就省略了。

在这里插入图片描述
在这里插入图片描述

栈空的情况:

在这里插入图片描述
注意哈,这个top表示的是数组下标。第一个数组的下标为0

栈满的情况:

在这里插入图片描述

存储区容量 cap = 11 ,意味着栈最多能存 11 个元素(对应数组下标 0 ~ 10 ,共11个可用位置 )。
top 表示下一个要存入数据的数组下标 ,初始为 0 。每存一个数据,top+1 指向下一个位置 。
top == cap(即 top = 11 )时,说明下一个要存的位置已经超出了数组最大下标(10 ),此时栈里已经存了cap个元素(下标0~10全占满 ),栈满,无法再存新数据。

具体代码实现:

1. 栈的头文件
//stack.h文件
//栈的头文件,谁包含我的这个头文件,谁就可以用我这个类型的声明和函数的声明
//头文件卫士,避免头文件被重复包含
#ifndef __STACK_H__
#define __STACK_H__//一.类型的声明
//用结构体表示栈
typedef struct stack{int* arr;//存储区的首地址int top;//控制存和取的操作int cap;//存储区的容量
}stack_t;
//定义栈类型的变量  stack_t s;
//定义变量的同时得初始化,我们可以将这个初始化操作封装到函数void stack_init(stack_t* p,int cap);里面//二.函数的声明
//栈的初始化
//参数:指向要初始化的栈的指针;栈的容量
//对指针p所指向的栈进行初始化,容量为cap
void stack_init(stack_t* p,int cap);//栈的释放
//参数:指向要释放的栈的指针
//对指针p所指向的栈进行释放
void stack_deinit(stack_t* p);//栈的判空
//参数:指向要判断的栈的指针
//如果指针p所指向的栈是空的,返回1;非空则返回0
int stack_empty(stack_t* p);//栈的判满
//参数:指向要判断的栈的指针
//如果指针p所指向的栈是满的,返回1;非满则返回0
int stack_full(stack_t* p);//压栈
//第一个参数:指向要存入数据的栈的指针
//第二个参数:要入栈的数据,传入该数据后会被存到指针p所指向的栈里面
void stack_push(stack_t* p,int data);//弹栈
//参数:指向要取出数据的栈的指针
//从指针p所指向的栈里面取出数据,返回取出的int类型数据
int stack_pop(stack_t* p);#endif
2.栈的实现
//stack.c文件
//栈的实现
#include<stdlib.h>//malloc() free()
#include"stack.h"//栈的初始化
//参数:指向要初始化的栈的指针;栈的容量
//stack_t s; s.arr s.top s.cap
//stack_init(&s,5);//实参
void stack_init(stack_t* p,int cap){//形参// p &s; cap = 5;// malloc返回值是void*类型,可以强转变成int*,也可以不写,因为编译器会自动进行隐式类型转换// 隐式类型转换:整转浮,有转无,小转大p->arr = (int*)malloc(sizeof(int) * cap);p->top = 0;p->cap = cap;
}//栈的释放
//参数:指向要释放的栈的指针
//stack_t s; s.arr s.top; s.cap
//stack_deinit(&s);//实参
void stack_deinit(stack_t* p){//形参free(p->arr);p->arr = NULL;p->top = 0;p->cap = 0;
}//栈的判空
//参数:指向要判断的栈的指针
//当指针p所指向的栈中没有存储数据(top为0)时,返回1;否则返回0
int stack_empty(stack_t* p){if(p->top == 0){return 1;}else{return 0;}
}//栈的判满
//参数:指向要判断的栈的指针
//当指针p所指向的栈中存储数据已满(top等于cap)时,返回1;否则返回0
int stack_full(stack_t* p){//return p->top == p->cap ? 1 : 0;return p->top == p->cap;
}//压栈
//参数:指向目标栈的指针;要入栈的数据
//把data的数据存到栈里面,存到arr里面,top作下标,arr[top] = data,存完之后top的值+1
void stack_push(stack_t* p,int data){//谁的arr谁的top,结构体里面的呀//arr[top] = data;这是错误的//p->arr[p->top] = data;//p->top++;//上面两行可以合成下面一行(先以top的值作为下标完成数据的存储,然后top的值再加一)p->arr[p->top++] = data;
}//弹栈
//参数:指向目标栈的指针
//如何拿数据:top先减一,然后以top作为下标将对应的这块存储区的数据拿出来存在val里面
int stack_pop(stack_t* p){//谁的top谁的arr,结构体里面的呀//top--;这是错误的//int val = arr[top];这是错误的p->top--;int val = p->arr[p->top];return val;//上面三行可以合并下面一行(先top的值减1,然后将top的值作为下标完成数据的取)//return p->arr[--p->top];
}
3. 栈的使用示例
//main.c
//栈的使用示例
#include<stdio.h>
#include"stack.h"
int main(void){//定义栈stack_t s;//栈的初始化:容量为11stack_init(&s,11);int data = 1;//往栈中依次存入数据:1 2 3 4 5 6 7 8 9 10 11//循环结束条件:栈满时停止存入(使用栈满判断函数)//stack_full(&s)返回1表示栈满,返回0表示栈未满while(stack_full(&s) != 1){stack_push(&s,data);data++;}//从栈中依次取出数据并打印//循环结束条件:栈空时停止取出(使用栈空判断函数)//stack_empty(&s)返回1表示栈空,返回0表示栈非空while(stack_empty(&s) != 1){printf("%d ",stack_pop(&s));}printf("\n");//释放栈资源stack_deinit(&s);return 0;
}
4. linux关于这个的使用步骤

1.创建一个文件夹

mkdir stack

2.创建三个文件
其中stack.c表示的是(栈的实现)
其中stack.h表示的是栈的头文件(栈的定义)
其中main.c表示的是(栈的使用)

touch stack.c
touch stack.h
touch main.c
  1. stack.cstack.h写完之后验证一下有没有语法错误,看我的stack.o的文件能不能成功生成
gcc -c stack.c
  1. 生成最终的可执行文件
gcc main.c stack.c -o stack
  1. 运行程序
./stack
  1. 运行之后的结果:
    11 10 9 8 7 6 5 4 3 2 1
http://www.dtcms.com/a/328311.html

相关文章:

  • 如何追踪需求状态变化
  • Ubuntu Server系统安装磁盘分区方案
  • 文件操作:文件IO操作流程及各类函数应用+标准IO与文件IO区别
  • Sentinel原理之规则管理
  • 力反馈手套让虚拟培训更加真实
  • GitHub的简单使用方法----(5)
  • AR眼镜新赛道:光波导与MicroOLED如何解决眩晕难题?
  • 低空智航平台技术架构深度解析:如何用AI +空域网格破解黑飞与安全管控难题
  • Ceph数据副本机制详解
  • 【编程实践】关于Vscode无法连接Anaconda解译器的问题
  • PCB题目基础练习1
  • 高速缓冲存储器cache
  • 肖臻《区块链技术与应用》第十讲:深入解析硬分叉与软分叉
  • 力扣top100(day01-03)
  • 基于RAII的智能指针原理和模拟实现智能指针
  • MySQL与其他数据库产品的比较,优势在哪里?
  • 《坐庄》电视剧
  • 基于Python的海量电商用户行为分析与可视化【推荐算法、统计模型、聚类模型、电商指标维度分析】
  • 【4】Transformers快速入门:自然语言模型 vs 统计语言模型
  • [激光原理与应用-257]:理论 - 几何光学 - 光束整形
  • 锁性能基准测试
  • 石英加速度计如何实现高精度测量?
  • 明远智睿T113-i核心板:工业设备制造领域的革新利器
  • 具身智能竞速时刻,百度百舸提供全栈加速方案
  • JVM性能调优技巧
  • Java集合学习之forEach()遍历方法的底层原理
  • 数据科学与计算:爬虫和数据分析案例笔记
  • 01数据结构-Kruskal算法
  • 破译真实感:渲染参数进阶指南——告别塑料感,唤醒材质生命力
  • 01. maven的下载与配置