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

栈的C实现

栈的C实现

  • 栈简介
  • 栈的C实现
    • 1.栈结构体
    • 2.初始化栈
    • 3.栈的基本操作

栈简介

栈(Stack)是一种后进先出的数据结构,类似于一个垂直的容器。

栈的特点是后进先出,即最后入栈的元素最先出栈。栈可以用来解决递归问题、实现函数调用、以及存储临时数据等。

例如,在计算机科学中,栈常用于实现函数调用栈,记录函数调用的顺序和参数。

希望本文通过使用C语言实现栈操作可以帮助读者理解栈的基本原理。

栈的C实现

1.栈结构体

想要实现栈结构,我们就要对其分配空间,可以使用结构体来实现。

结构体包含的此栈空间的起始地址、栈尺寸、栈顶元素。

如下:


//栈结构体
typedef struct Stack {int *data;      // 栈内元素指针int top;        // 栈顶元素索引int size;       // 栈尺寸
} Stack;

2.初始化栈

有了栈结构后,我们在使用栈之前还要进行初始化。

初始化操作有分配一个栈结构体、分配指定大小的内存空间存储栈数据。

如下:


// 初始化栈
Stack* initStack(int size) 
{Stack *stack = (Stack *)malloc(sizeof(Stack));      //  分配栈结构体并获取结构体指针stack->data = (int *)malloc(size * sizeof(int));    //  为栈内元素分配有size个int类型元素的空间,并将地址赋值给栈内元素指针stack->top = -1;                                     //  初始化栈顶元素索引为-1,表示栈空stack->size = size;                                  //  初始化栈尺寸为实际大小(即传入的size大小)return stack;                                       //  返回栈结构体指针
}

3.栈的基本操作


// 入栈
void push(Stack *stack, int value)
{if (stack->top < stack->size - 1)       // 判断栈是否已满{stack->data[++stack->top] = value;  //将栈顶索引加1,并将数据插入栈顶}else {printf("栈已满,无法入栈!\n");}
}// 出栈
int pop(Stack *stack)
{if (stack->top >= 0)                     // 判断栈是否为空{return stack->data[stack->top--];   // 从栈顶获取数据,并将栈顶索引减1}else{printf("栈为空,无法出栈!\n");return -1; // 或者返回异常}
}// 获取栈顶元素
int top(Stack *stack)
{if (stack->top >= 0)                     // 判断栈是否为空{return stack->data[stack->top];     // 从栈顶获取数据}else{printf("栈为空,无法获取栈顶元素!\n");return -1; // 或者返回异常}
}// 将栈设置为空
int setEmpty(Stack *stack)
{return stack->top == -1;
}// 释放栈资源
void freeStack(Stack *stack)
{free(stack->data);free(stack);
}

以上就是用C实现的栈的基本操作,

当然栈还有共享栈、链栈等,但本文介绍到的操作也是提到的这两种栈操作的基本,读者可以尝试着在此基础上实现共享栈与链栈的操作。

http://www.lryc.cn/news/457618.html

相关文章:

  • 【MySQL】入门篇—数据库基础:关系数据库概念
  • 不到千元的自动猫砂盆是智商税吗?这四大选购技巧不看就亏大了
  • 【图论】(二)图论基础与路径问题
  • Git常用命令(持续更新中)
  • 什么是PLM系统?PLM系统对制造业起到哪些作用?三品PLM系统对汽车制造业意义
  • Pr 视频效果:元数据和时间码刻录
  • 前端MD5加密
  • 仿IOS桌面悬浮球(支持拖拽、自动吸附、自动改变透明度与点击、兼容PC端与移动端)
  • 智谱开放平台API调用解析
  • Linux中定时删除10天前的日志文件
  • 贝壳Android面试题及参考答案
  • 基于vue的酒店预订管理系统(源码+定制+开发)
  • FreeRTOS——TCB任务控制块、任务句柄、任务栈详解
  • 【STM32单片机_(HAL库)】4-5-2【定时器TIM】【感应开关盖垃圾桶项目】HC-SR04超声波模块实验
  • 安全网络架构
  • 【万字长文】Word2Vec计算详解(二)Skip-gram模型
  • 随机掉落的项目足迹:解决TypeError: Cannot read properties of undefined (reading ‘push‘)报错
  • ChatTTS 本地安装和测试
  • [Leetcode] 560 Subarray Sum Equals K
  • TCL Android面试题大全及参考答案
  • JVM错误:OutOfMemoryError: GC overhead limit exceeded
  • Unity网络开发 - C#开源网络通信库PESocket的使用
  • 【完-网络安全】Shell与脚本
  • 磁盘标签和分区标签
  • 关于摩托车一键启动无钥匙进入、智能科技创新
  • 怎么找矩阵系统,怎么源码搭建,源头技术开发需要哪些支持
  • 云原生化 - 工具镜像(简约版)
  • uni-app如何搭建项目(一步一步教程)
  • javascript中原型链(__proto__)与原型(prototype)
  • 基于多种机器学习的酒店客户流失预测模型的研究与实现