广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言 栈与数组的实现详解
  • 142
分享到

C语言 栈与数组的实现详解

2024-04-02 19:04:59 142人浏览 泡泡鱼
摘要

目录栈的实现栈的定义数组实现静态栈动态栈链栈栈的实现 首先我们思考一个问题,什么是栈? 栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的

栈的实现

首先我们思考一个问题,什么是栈?

栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的是栈 和 StackOverflowException,栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞)。

栈的定义

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素

栈的应用广泛,比如你的程序执行查看调用堆栈、计算机四则加减运算、算法的非递归形式、括号匹配问题等等。所以栈也是必须掌握的一门数据结构。最简单大家都经历过,你拿一本书上下叠在一起,就是一个后进先出的过程,你可以把它看成一个栈。下面我们介绍数组实现的栈两种形式。

数组实现

静态栈

一般不推荐使用这种方法,因为当空间不够用时,增容会有点麻烦,不实用。

typedef struct Stack
{ 
    STDataType _a[];  //STDataType 为int宏定义,当然你也可以将它定义为其他类型,宏定义是为了换栈类型的时候方便一点
    int _top; // 栈顶
    int _capacity; // 容量
}Stack;

动态栈

相比静态栈,动态栈空间不够时可以直接时用realloc动态扩容,但是动态扩会有一定程度的消耗,我们会直接扩容一倍,当使用不完时会造成一定程度的空间浪费。

typedef struct Stack
{ 
    STDataType* _a;//指向一块开辟出来的连续空间的指针
    int _top; // 栈顶
    int _capacity; // 容量
}Stack;

栈要实现的操作

// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);

栈的初始化

void StackInit(Stack* ps)
{
    ps->_a = NULL; //初始化时将指针指向空,此时没有开辟空间
    //这里可以将top赋值为0,也可以赋值为-1。
    ps->_top = -1;  //赋值为0时表示top为栈顶元素的下一个位置的下标,赋值为-1时top为栈顶元素的下标
    ps->_capacity = 0; //栈的容量
}

入栈

void StackPush(Stack* ps, STDataType data)
{
    assert(ps);
    //考虑要不要增容
    //当top为0时判断条件为
    //if(ps->top==ps->_capacity)
    if (ps->_top+1 == ps->_capacity)//当栈满时进入
    {
        //判断当前栈的容量是否为0,为0的话开辟4个空间,不为0时扩容一倍
        int newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
        STDataType* tmp = realloc(ps->_a, sizeof(STDataType) * newcapacity);
        if (tmp == NULL)
        {
            exit(-1);
        }
        ps->_a = tmp;
        ps->_capacity = newcapacity;
    }
    //扩容完成,或者不用扩容,开始插入
    ps->_top++;
    ps->_a[ps->_top] = data;
    //当top为0时插入操作
    //ps->_a[ps->_top] = data;
    //ps->_top++;
}

出栈

void StackPop(Stack* ps)
{
    assert(ps);
    //判断是否为空
    assert(!StackEmpty(ps));//暴力判断
    //if (top==-1)//温柔判断
    //{
    //  printf("栈已经空了!\n");
    //  exit(-1); //甩出异常
    //}
    ps->_top--;
}

取栈顶元素

STDataType StackTop(Stack* ps)
{
    assert(ps);
    //判断是否为空,为空甩出异常。
    assert(!StackEmpty(ps));
    //if (!StackEmpty(ps)) {
    //  printf("栈为空!\n");
    //  exit(-1);
    //}
    return ps->_a[ps->_top]; //返回栈顶元素
}

判断栈中有几个有效数据

//取出栈里有效元素个数。
int StackSize(Stack* ps)
{
    assert(ps);
    return ps->_top+1; 
}

判断栈是否为空

bool StackEmpty(Stack* ps)
{
    assert(ps);
    return ps->_top == -1;  //ps->_top为-1返回true,否则返回false.
​
}

销毁栈

销毁栈是必不可少的的一步,如果没有销毁的话会造成内存泄露

void StackDestroy(Stack* ps)
{
    assert(ps);
    free(ps->_a);
    ps->_a = NULL;
    ps->_top = -1;
    ps->_capacity = 0;
}

链栈

最后介绍一下链栈,这里就不实现了有兴趣的话可以自己实现一下。

链栈和链表一样的,也是通指针将各个数据块链接起来的

设计链栈是最好设计为双向链表,否则当你设计为用尾作栈顶是出栈效率低。

用头做栈顶时,头插头删,可以设计为单链表。

到此这篇关于C语言 栈与数组的实现详解的文章就介绍到这了,更多相关C语言 栈与数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言 栈与数组的实现详解

本文链接: https://www.lsjlt.com/news/146189.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言 栈与数组的实现详解
    目录栈的实现栈的定义数组实现静态栈动态栈链栈栈的实现 首先我们思考一个问题,什么是栈? 栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的...
    99+
    2022-11-13
  • C语言栈与队列相互实现详解
    目录一、本章重点二、队列实现栈三、栈实现队列四、解题思路总结一、本章重点 用两个队列实现栈用两个栈实现队列解题思路总结 二、队列实现栈  我们有两个队列:  ...
    99+
    2022-11-13
  • C语言实现栈的示例详解
    目录前言一. 什么是栈二. 使用什么来实现栈三. 栈的实现3.1 头文件3.2 函数实现3.3 完整代码四. 栈的用处前言 前一段时间,我们试着用C语言实现了数据结构中的顺序表,单链...
    99+
    2022-11-13
  • C语言函数栈帧详解
    目录前言一.函数栈帧是什么?二、栈帧准备知识1.内存分区2.什么是栈?三、详解栈帧创建与销毁全过程调用函数之前:将传入函数的值放入栈中函数执行:1.保护当前ebp2.创建所需调用函数...
    99+
    2022-11-12
  • C语言超详细讲解栈与队列实现实例
    目录1.思考-12.栈基本操作的实现2.1 初始化栈2.2 入栈2.3 出栈2.4 获取栈顶数据2.5 获取栈中有效元素个数2.6 判断栈是否为空2.7 销毁栈3.测试3.1 测试3...
    99+
    2022-11-13
  • C语言函数栈帧的创建与销毁详解
    目录前言一、函数栈帧是什么?1.寄存器2.ebp与esp二、函数栈帧的创建1.代码块2.调用堆栈3.esp与ebp如何维护栈帧总结 前言 大家在学习的时候一定有以下困惑: ...
    99+
    2022-11-13
  • C语言详解如何实现顺序栈
    目录顺序栈的定义顺序栈的理解准备工作具体实现今天说的是关于数据结构顺序栈的一些基本操作c语言实现。 顺序栈的定义 首先,我们先来简单了解一下顺序栈,前面线性表我们知道,根据顺序存储或...
    99+
    2022-11-13
  • C语言栈与队列面试题详解
    目录1、括号匹配问题2、用队列实现栈3、用栈实现队列4、设计循环队列1、括号匹配问题 链接直达: 有效的括号 题目: 思路: 做题前,得先明确解题方案是啥,此题用栈的思想去解决是较...
    99+
    2022-11-13
  • C语言中栈的两种实现方法详解
    目录一、顺序栈二、链式栈总结一、顺序栈 #include<stdio.h> #include<stdlib.h> #define maxsize 64 ...
    99+
    2022-11-12
  • 详解C语言数据结构之栈
    目录栈的链式实现主要内容代码实现:总结栈的链式实现 主要内容 (1) 栈包含7个元素,依次是67,3,88,6,1,7,0,采用尾插入法创建 栈,为该栈设置两个指针,一个bottom...
    99+
    2022-11-12
  • TypeScript数组实现栈与对象实现栈的区别详解
    目录前言数组实现栈实现思路实现代码编写测试代码对象实现栈实现代码编写测试代码二者的区别十进制转二进制前言 栈作为一种数据结构,它可以应用在很多地方,当你需要经常获取刚存放进去的数据时...
    99+
    2022-11-13
  • C语言之包含min函数的栈实例详解
    目录一、题目描述二、思路分析三、整体代码总结一、题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时...
    99+
    2022-11-13
  • C语言超详细讲解栈的实现及代码
    目录前言栈的概念栈的结构栈的实现创建栈结构初始化栈销毁栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空总代码Stack.h 文件Stack.c 文件Test.c 文件前言 栈...
    99+
    2022-11-13
  • 详细理解函C语言的函数栈帧
    目录一、函数栈帧的创建1.寄存器2.函数栈帧3.函数中调用函数二、函数栈帧的销毁总结一、函数栈帧的创建 1.寄存器 一般来说,计算机中的寄存器有六种 分别是:eax, ebx, e...
    99+
    2022-11-12
  • C语言超详细解析函数栈帧
    目录一、前面二、预备知识三、栈帧创建与销毁四、总结一、前面 本章将以汇编视角看函数栈帧的内存是如何使用与回收的,为了降低汇编语言的理解成本,以图示的方式讲解每一步汇编指令所带来的效果...
    99+
    2022-11-13
  • C语言的数组指针与函数指针详解
    目录前言函数指针语法数组指针与指针数组总结前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。 函数指针语法 定义一个函数指针,并通...
    99+
    2022-11-13
  • C语言用栈模拟实现队列问题详解
    目录题目描述题目链接思路分析代码实现题目描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)。 你只能使用标准的栈操作...
    99+
    2022-11-13
  • C语言分别实现栈和队列详解流程
    目录什么是栈栈的结构图示栈的实现创建栈的结构体初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空栈的销毁什么是队列?队列的实现创建队列结构体初始化队列队尾入队列队头出队列...
    99+
    2022-11-13
  • c语言的指针数组详解
    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p;...
    99+
    2022-11-12
  • C语言多维数组数据结构的实现详解
    目录数据结构之多维数组各基本操作函数原型说明 各基本操作的具体实现测试分析思考与小结1、 对数组的再认识2、调试过程中遇到的问题及解决方案3、算法的时间复杂度分析总结数据结构之多维数...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作