数据结构之栈的实现及相关OJ题

news2025/7/14 13:55:04

🕺作者@启明星使

🎃专栏:《数据库》《C语言》

🏇分享一句话:

对的人会站在你的前途里 志同道合的人才看得懂同一片风景

大家一起加油🏄‍♂️🏄‍♂️🏄‍♂️

希望得到大家的支持,如果有帮助希望得到的大家三连~~~afbae359ff6c469aa4242bd6dcb5e558.jpeg

目录

前言

思路

1. 定义结构体

2.初始化

3. 销毁

4. 入栈

2 容量足够:

利用数组的性质将值赋给栈顶

栈顶自增

5. 出栈

6. 栈长

7. 栈空

代码实现

1. 定义结构体

2. 初始化

3. 销毁

4. 入栈

5. 出栈

6. 栈长

7. 栈空

OJ题(简单)

题解


前言

实现栈有很多种方式,在这里我们使用的方法是动态数组实现。

栈的概念及结构 

  • 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
  • 进行数据插入和删除 操作的一端称为栈顶,另一端称为栈底。
  • 栈中的数据元素遵守后进先出LIFO(Last In First Out) 的原则。

 

 

思路

  • 拓展:assert()内的条件若返回错误则停止程序 非必要只是方便Debug
  • tips:主函数中得先定义一个结构体变量

1. 定义结构体

  • 数组
  • 栈顶
  • 记录存储容量的变量

2.初始化

  • assert()断言:判断结构体是否存在
  • 先给数组开辟一个初始空间4
  • 判断开辟空间是否成功
  • 存储容量为4
  • 栈顶为0

3. 销毁

  • assert()断言:判断结构体是否存在
  • 销毁数组,将数组置为NULL
  • 将栈顶的值和存储容量的变量置为0

4. 入栈

  • assert()断言:判断结构体是否存在 先判断容量是否足够:
  • 1. 不够则增容(假设增两倍)
    • 这里用的是realloc 会先将原数组的值先拷贝,开辟一个新空间增容。
    • 增容后判断是否成功增容
    • 失败则打印增容失败
    • 成功则把新空间的地址赋给结构体变量里的数组
    • 存储容量的变量
  • 2 容量足够:

    • 利用数组的性质将值赋给栈顶

    • 栈顶自增

5. 出栈

  • 取栈顶值
    • assert()断言:判断结构体是否存在
    • assert()断言:判断栈顶是否大于0
    • 利用数组性质返回栈顶元素的值
  • 删去栈顶
    • assert()断言:判断结构体是否存在 a
    • ssert()断言:判断栈顶是否大于0
    • 栈顶位置减一

6. 栈长

  • assert()断言:判断结构体是否存在
  • 返回栈顶下标即为栈长

7. 栈空

  • assert()断言:判断结构体是否存在
  • 返回一个bool值 根据栈顶下标是否为0判断栈是否为空

代码实现

1. 定义结构体

typedef struct Sqstack
{
    Elemtype* a;
    int top;
    int capacity;
}Sq;

2. 初始化

void Initstack(Sq*st) {
    assert(st);
    st->a = (Elemtype*)malloc(sizeof(Elemtype) * 4);
    if (st->a == NULL) {
        printf("malloc fail\n");
        exit(-1);
    }
    st->capacity = 4;
    st->top = 0;
} 

3. 销毁

void DestroySt(Sq* st) {
    assert(st);
    free(st->a);
    st->a = NULL;
    st->top = st->capacity = 0;
}

4. 入栈

void InsertSt(Sq* st,Elemtype x) {
    assert(st);
    if (st->top == st->capacity) {
        Elemtype* tem = (Elemtype*)realloc(st->a, st->capacity * 2 * sizeof(Elemtype));
        if (tem == NULL) {
            printf("realloc fail\n");
            exit(-1);
        }
        else
        {
            st->a = tem;
            st->capacity *= 2;
        }
    }
    st->a[st->top] = x;
    st->top++;
}
​

5. 出栈

Elemtype TopSt(Sq* st) {
    assert(st);
    assert(st->top > 0);
    return st->a[st->top -1];
}
void PopSt(Sq* st) {
    assert(st);
    assert(st->top > 0);
    st->top--;
}

6. 栈长

int Stsize(Sq* st) {
    assert(st);
    return st->top;
}

7. 栈空

bool StEmpty(Sq* st) {
    assert(st);
    return st->top == 0;
}

OJ题(简单)

有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104

  • s 仅由括号 '()[]{}' 组成

题解

typedef char Elemtype;
typedef struct Sqstack
{
    Elemtype* a;
    int top;
    int capacity;
}Sq;
void Initstack(Sq*st) {
    assert(st);
    st->a = (Elemtype*)malloc(sizeof(Elemtype) * 4);
    if (st->a == NULL) {
        printf("malloc fail\n");
        exit(-1);
    }
    st->capacity = 4;
    st->top = 0;
} 
void DestroySt(Sq* st) {
    assert(st);
    free(st->a);
    st->a = NULL;
    st->top = st->capacity = 0;
}
void InsertSt(Sq* st,Elemtype x) {
    assert(st);
    if (st->top == st->capacity) {
        Elemtype* tem = (Elemtype*)realloc(st->a, st->capacity * 2 * sizeof(Elemtype));
        if (tem == NULL) {
            printf("realloc fail\n");
            exit(-1);
        }
        else
        {
            st->a = tem;
            st->capacity *= 2;
        }
    }
    st->a[st->top] = x;
    st->top++;
}
​
Elemtype TopSt(Sq* st) {
    assert(st);
    assert(st->top > 0);
​
    return st->a[st->top -1];
}
void PopSt(Sq* st) {
    assert(st);
    assert(st->top > 0);
    st->top--;
}
int Stsize(Sq* st) {
    assert(st);
    return st->top;
}
bool StEmpty(Sq* st) {
    assert(st);
    return st->top == 0;
}
int lengths(char*s){
    int i=0;
    while(s[i]!='\0'){
        i++;
    }
    return i;
}
bool isValid(char * s){
    Sq st;
    Initstack(&st);
    
    while(*s !='\0'){
        switch(*s)
        {
            case '{':
            case '[':
            case '(':
            {
                InsertSt(&st,*s);
                ++s;
                break;
            }
            case '}':
            case ')':
            case ']':
            {
                if(StEmpty(&st)){
                    DestroySt(&st);
                    return false;
                }
                char top=TopSt(&st);
                PopSt(&st);
​
                if((*s=='}'&&top!='{')
                ||(*s==']'&&top!='[')
                ||(*s==')'&&top!='('))
                {
                    DestroySt(&st);
                    return false;
                }
                else{
                    ++s;
                }
                break;
            }
            default:
                break;
        }
    }
​
    bool ret=StEmpty(&st);
    DestroySt(&st);
    return ret;
        
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【毕业设计】新闻分类系统 - 深度学习 机器学习

文章目录0 前言1 简介2 参与及比较算法3 先说结论4 实现过程4.1 数据爬取4.2 数据预处理5 CNN文本分类6 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&a…

事件总线EventBus

事件总线是对发布-订阅模式的一种实现&#xff0c;是一种集中式事件处理机制&#xff0c;允许不同的组件之间进行彼此通信而又不需要相互依赖&#xff0c;达到一种解耦的目的。 什么是“总线”&#xff1a;一个集中式的事件处理机制。同时服务多个事件和多个观察者。相当于一个…

C#编程深入研究变量,类型和方法

编写正确的C#代码 简单的调试技术 变量的语法 声明类型和值 仅声明类型 访问修饰符 使用类型 通用内置类型 类型转换 推断式声明 自定义类型 类型综述 命名变量 变量的作用域 运算符 定义方法 指定参数 指定返回值 常见的Unity方法 Start方法 Update方法 …

金山云:基于 JuiceFS 的 Elasticsearch 温冷热数据管理实践

01 Elasticsearch 广泛使用带来的成本问题 Elasticsearch&#xff08;下文简称“ES”&#xff09;是一个分布式的搜索引擎&#xff0c;还可作为分布式数据库来使用&#xff0c;常用于日志处理、分析和搜索等场景&#xff1b;在运维排障层面&#xff0c;ES 组成的 ELK&#xff…

MMDetection3D库中的一些模块介绍

本文目前仅包含2个体素编码器、2个中间编码器、1个主干网络、1个颈部网络和1个检测头。如果有机会&#xff0c;会继续补充更多模型。 若发现内容有误&#xff0c;欢迎指出。 MMDetection3D的点云数据一般会经历如下步骤/模块&#xff1a; #mermaid-svg-q9Wy2NQvFHfuPWKs {font-…

骨传导原理是什么,佩戴骨传导耳机的过程中对于耳道有无损害

随着新时代的到来&#xff0c;我们周围的数码产品逐渐被新产物所替代&#xff0c;以往在耳机市面上&#xff0c;普遍都是入耳式耳机&#xff0c;但长时间佩戴这种耳机的话对于我们耳道来说是有着不可逆的伤害&#xff0c;而在近几年骨传导耳机的出现&#xff0c;打破了传统耳机…

18.Redis系列之AOF方式持久化

本文学习redis7两大持久化技术之一&#xff1a;AOF&#xff08;Append Only File&#xff09;日志追加方式持久化备份与还原&#xff0c;重写以及AOF方式的优缺点 1. AOF相关配置 首先我们先简单了解下Redis7中AOF相关配置 // 开启AOF方式持久化&#xff0c;默认no appendon…

基于真实场景解读 K8s Pod 的各种异常

在 K8s 中&#xff0c;Pod 作为工作负载的运行载体&#xff0c;是最为核心的一个资源对象。Pod 具有复杂的生命周期&#xff0c;在其生命周期的每一个阶段&#xff0c;可能发生多种不同的异常情况。K8s 作为一个复杂系统&#xff0c;异常诊断往往要求强大的知识和经验储备。结合…

骚戴独家笔试---SQL笔试

SQL笔试训练 查询结果去重 两种答案 查找某个年龄段的用户信息 查找除复旦大学的用户信息 三种答案 用where过滤空值练习 三种答案 查询NULL时&#xff0c;不能使用比较运算符(或者< >)&#xff0c;需要使用IS NULL运算符或者IS NOT NULL运算符。 操作符混合运用 我这里…

力扣 792. 匹配子序列的单词数

题目 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其余字符的相对顺序。 例如&#xff0c; “ace” 是 “abcde” 的子序…

java spring引用外部jar包并使用

spring引用外部jar包并使用1、将jar包放到src/main/resources/lib2、编辑pom.xml文件build下面加入resources&#xff0c;不加话的打包会找不到资源3、project structure中引入该lib1、将jar包放到src/main/resources/lib 2、编辑pom.xml文件 打开pom文件&#xff0c;找到相应…

计算机网络基本知识

计算机网络基本知识 计算机网络定义&#xff1a;是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 1.1计算机网络在信息时代作用 1.2因特网概述 1.2.1网络、互联网、因特网 网…

DeepLab V1学习笔记

DeepLab V1摘要相关的工作遇到的问题和解决的方法信号下采样空间不变性(spatial insensitivity/invariance)论文的优点(贡献)网络的模型空洞卷积CRF多尺度预测模型总结实验结果Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs论文地址 : D…

[附源码]java毕业设计乒乓球俱乐部管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【光学】基于Matlab模拟干涉条纹图

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

亿级万物互联新时代的物联网消息中间件EMQX调研

简介 最近去某餐厅吃饭&#xff0c;进门时智能门自动打开房门同时来一句"欢迎光临"&#xff0c;然后伸手到门口的洗手台&#xff0c;水管无接触自动出水&#xff0c;端起菜盘走向台子选择自己喜欢的菜品&#xff0c;最后将菜盘放在智能结账机上&#xff0c;智能结账…

代码随想录算法训练营第三天|LeetCode 203.移除链表元素 、707.设计链表 、206.反转链表

LeetCode 203.移除链表元素 题目链接&#xff1a;203.移除链表元素 链表的定义&#xff1a; // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 };ListNode(i…

数据结构实验教程-第一套

1&#xff0e;在平衡二叉树中插入一个结点后造成了不平衡&#xff0c;设最低的不平衡结点为A&#xff0c;并已知A的左孩子的平衡因子为1&#xff0c;右孩子的平衡因子为0&#xff0c;则应作_型调整以使其平衡。 A.LL B.LR C.RL D.RR答案为a&#xff0c;错选了c。 平衡因子 左子…

model.py篇

model.py篇 目录如下&#xff1a; 引言找LeNet5网络结构书写代码测试结果函数解释 引言 卷积主要用于特征的提取&#xff0c;而model.py则是为了从输入信息中筛选出我们需要的信息。 我们在阅读完论文后&#xff0c;对我们需要的模型进行搭建&#xff0c;下以LeNet5的model…

子域名访问计数(哈希表、字符串、索引)

力扣地址&#xff1a;力扣 网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" &#xff0c;二级域名为 "leetcode.com" &#xff0c;最低一级为 "discuss.leetcode.com" 。当访问域名 "discuss.leetcode.com&…