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

栈的基本操作

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以支持一下。
👑👑👑💎👑👑👑


目录:
一:初始化
二:销毁
三:进栈(入栈 / 压栈)
四:出栈
五:获取栈顶元素
六:求栈中元素个数
七:判空
八:练习

栈的基本了解: 栈的概念和结构:

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。
栈中的数据元素遵守后进先出LIFOLast In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据也在栈顶
1:初始化

在对栈进行初始化之前需要先对栈这个结构进行定义一下

这里暂且就以 数组栈为例

typedef int STDataType;
typedef struct Stack {STDataType* a;//动态的int capacity;//容量int top;//记录栈顶位置
}ST;

初始化:让 capacity = 0,至于 top 是为0 还是为 1,自行决定 

void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;//表示 top  指向栈顶元素下一个位置//pst->top = -1;//表示 top  指向栈顶元素的位置
}
2:销毁

这个就很简单了,直接对 数组进行销毁即可

3:进栈(入栈 / 压栈)

注意: 初始化 top 的值  对进栈的操作很重要

top = 0 :top 指向栈顶元素下一个的位置

top =  0 ,此时进栈需要 先把数据插到 top  对应的位置,之后top++ 

top = 0 :刚好也可以表示 栈中数据元素个数为 0

top = -1 :top 指向 栈顶元素位置

top = -1:

进栈的操作:先让top++;再对top 所在地位置进行插入数据 

 

void STPush(ST* pst, STDataType x)
{assert(pst);//空间检查if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL)return;//成功pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;//指向栈顶元素下一个位置
}
4:出栈

直接一步到位即可;让top - - 

注意不是 top -1

void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));//判空pst->top--;
}
5:获取栈顶元素
STDataType STTop(ST* pst)//获取栈顶元素
{assert(pst);return pst->a[pst->top-1];// 注意top 永远指向栈顶元素下一个位置
}
6:求栈中元素个数
int STSize(ST* pst)//求栈中元素个数
{assert(pst);return pst->top;
}
7:判空 
bool STEmpty(ST* pst)
{assert(pst);/*if (pst->top == 0){return true;}elsereturn false;*/return pst->top == 0;//不用三目操作符
}
完整代码:
 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"void test()
{ST st;STInit(&st);STPush(&st, 1);//STPrint(&st);//注意没有这种写法//对于栈的访问都是边访问边出栈STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);STPush(&st, 6);int size = STSize(&st);while (!STEmpty(&st)){printf("%d ", STTop(&st));//获取栈顶元素STPop(&st);//出栈}STDestroy(&st);}
int main()
{test();return  0;
}
Stack.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;//表示 top  指向栈顶元素下一个位置//pst->top = -1;//表示 top  指向栈顶元素的位置
}
void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;
}void STPush(ST* pst, STDataType x)
{assert(pst);//空间检查if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL)return;//成功pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;//指向栈顶元素下一个位置
}
void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));//判空pst->top--;
}STDataType STTop(ST* pst)//获取栈顶元素
{assert(pst);return pst->a[pst->top-1];// 注意top 永远指向栈顶元素下一个位置
}int STSize(ST* pst)//求栈中元素个数
{assert(pst);return pst->top;
}bool STEmpty(ST* pst)
{assert(pst);/*if (pst->top == 0){return true;}elsereturn false;*/return pst->top == 0;//不用三目操作符
}
Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDataType;
typedef struct Stack {STDataType* a;//动态的int capacity;//容量int top;//记录栈顶位置
}ST;void STInit(ST* pst);
void STDestroy(ST* pst);void STPush(ST* pst, STDataType x);
void STPop(ST* pst);STDataType STTop(ST* pst);//获取栈顶元素int STSize(ST* pst);//求栈中元素个数bool STEmpty(ST* pst);

 8:练习

刚刚好学了栈,那咱就趁热打铁练习一下 

分析:

当是左括号中的 {   (     [   任一个,我们就进栈  ;若是出现对应的右括号中的任一个我们就去栈顶元素进行匹配 若是 左右括号不能匹配成功则  return  false;

结语:

以上就是我今日要share 的,总体来说很简单相较于链表那块,轻松拿捏,同时在今天这个特别 的日子里也是祝愿大家新春快乐,在新的一年里快快乐乐,在学习上工作上一帆风顺

相关文章:

  • 相机图像质量研究(3)图像质量测试介绍
  • [UI5 常用控件] 06.Splitter,ResponsiveSplitter
  • [职场] 服务行业个人简历 #笔记#笔记
  • 【Java EE初阶十】多线程进阶二(CAS等)
  • Linux开机自动执行自定义脚本或命令
  • ffmpeg命令生成器
  • Git合并多个commit
  • PostgreSql与Postgis安装
  • 【Spring框架】Spring事务同步
  • Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)
  • Redis Centos7 安装到启动
  • Spring框架常见的注解Spring、SpringMVC、SpringBoot)
  • 华为CC++语言编程规范--笔记
  • C语言----内存函数
  • 接口自动化测试,完整入门篇
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • CentOS 7 修改主机名
  • egg(89)--egg之redis的发布和订阅
  • HTTP那些事
  • Javascript Math对象和Date对象常用方法详解
  • Laravel Telescope:优雅的应用调试工具
  • Linux中的硬链接与软链接
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • vue 个人积累(使用工具,组件)
  • Vue ES6 Jade Scss Webpack Gulp
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 山寨一个 Promise
  • 什么软件可以剪辑音乐?
  • 双管齐下,VMware的容器新战略
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 追踪解析 FutureTask 源码
  • (02)Hive SQL编译成MapReduce任务的过程
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .Net Core 中间件验签
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net访问oracle数据库性能问题
  • .net分布式压力测试工具(Beetle.DT)
  • .NET连接数据库方式
  • .NET中使用Redis (二)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • [ACM] hdu 1201 18岁生日
  • [ai笔记4] 将AI工具场景化,应用于生活和工作