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

第六章:C语言数据结构与算法初阶之栈

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、栈
  • 二、栈的实现
  • 三、接口函数的实现
    • 1、初始化
    • 2、销毁栈
    • 3、压栈与出栈
    • 4、判空
    • 5、元素个数
    • 6、返回栈顶元素
  • 四、栈中元素的访问
  • 总结


前言

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。


一、栈

在这里插入图片描述

栈的结构如上图所示:像一个桶,元素是在竖直放入的。
在这里插入图片描述

栈只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,即元素遵循后进先出的原则,但注意这个是相对于栈内的元素。

二、栈的实现

在这里插入图片描述
我们可以用数组或链表的结构来实现栈,但栈这种数据结构是不存在随即插入这种方式的,因为它只能尾插。
我们以链表的方式来模拟的时候,我们需要不断地找尾,这个过程的时间复杂度是O(N)。所以我们是用数组可以更好的来实现栈的结构。

typedef struct Stack
{STDataType* a;int capacity;int top;
}ST;

三、接口函数的实现

1、初始化

void StackInit(ST* ps)
{assert(ps);ps->capacity = 4;ps->a = (STDataType*)malloc(sizeof(STDataType)*(ps->capacity));assert(ps->a);ps->top = 0;//栈顶元素的下一位置下标 top = 0/ 栈顶元素 top = -1
}

默认开辟四个元素大小空间,将top设为0,capacity设置为4。

2、销毁栈

void StackDestory(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = 0;ps->capacity = 0;}

3、压栈与出栈

void StackPush(ST* ps, STDataType x)
{assert(ps);//扩容if (ps->top == ps->capacity){ps->a = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);ps->capacity *= 2;assert(ps->a);}ps->a[ps->top] = x;ps->top++;
}
void StackPop(ST* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}

压栈是尾部插入元素,所以要注意可能要扩容。
当一个栈为空的时候,恰好就是top为0的时候。

4、判空

bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

当一个栈为空的时候,恰好就是top为0的时候,因此,我们可以通过top来判断栈是否为空。

5、元素个数

int StackSize(ST* ps)
{assert(ps);return ps->top;
}

6、返回栈顶元素

STDataType StackTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}

四、栈中元素的访问

栈是无法像顺序表和链表那样不断地遍历元素的。因为,想要遍历元素必须取出栈顶元素,也就是说,我们必须删除栈顶的元素才能访问到下一个元素。因此,栈只能遍历一次,遍历一次之后就代表着栈已经空了。


总结

栈的特点就是后进先出。
任何问题都有解决的办法,无法可想的事是没有的。——爱迪生

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

相关文章:

  • Android学习之WebView
  • 3/11 考试总结
  • Leetcode 141.环形链表 142环形链表II
  • hibernate学习(五)
  • STM32CubeIDE 快速开发入门指南
  • 华为OD机试 - 火星文计算(C 语言解题)【独家】
  • 超超超超保姆式详解——字符函数和字符串函数(学不会打我)上
  • Data mesh 笔记
  • (八十三)大白话透彻研究通过explain命令得到的SQL执行计划(2)
  • 案例18-面向对象之开门小例子
  • 【碎片化知识总结】三月第一周
  • 从零开始的JSON库(1):启程
  • 【Java】数组
  • 【C++】非类型的模板参数,特化
  • 核方法(kernel Method)
  • 消息队列MQ用来做什么的,市场上主流的四大MQ如何选择?RabbitMQ带你HelloWorld!
  • 2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E
  • 一文分析Linux v4l2框架
  • MFC常用控件使用(文本框、编辑框、下拉框、列表控件、树控件)
  • 13 node 程序后台执行加上 tail 命令, 中断 tail 命令, 同时也中断了 node 程序
  • 52癫痫发作预测的有效双自注意力残差网络
  • 【计算机网络】Tcp IP 面试题相关
  • 【MySQL】MySQL的存储引擎
  • es6动态模块import()
  • 【Flask】Jinja2模板(十四)
  • Mr. Cappuccino的第49杯咖啡——冒泡APP(升级版)之基于Docker部署Gitlab
  • 《机器学习》基础概念之【P问题】与【NP问题】
  • WinRAR安装教程
  • C++:vector和list的迭代器区别和常见迭代器失效问题
  • SpringSecurity如何实现前后端分离