【数据结构篇】~栈和队列(附源码)

news2025/1/11 5:45:28

【数据结构篇】~栈和队列

  • 前言
  • 一、栈的实现
    • 1.头文件
    • 2.源文件
    • 3.一个算法题——[有效的括号](https://leetcode.cn/problems/valid-parentheses/description/%E2%80%8B)
  • 二、队列
    • 1.头文件
    • 2.源文件

前言

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

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

一、栈的实现

在这里插入图片描述
在这里插入图片描述

1.头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
//栈的实现很多和顺序表相同
typedef int stdatatype;
typedef struct stack
{
	stdatatype* arr;
	int capacity;//有效容量
	int top;//栈顶
}st;
void stinit(st* ps);// 初始化栈
void stdestroy(st* ps);// 销毁栈
void stpush(st* ps, stdatatype x);// 入栈
void stpop(st* ps);//出栈
stdatatype stTop(st* ps);//取栈顶元素
int stsize(st* ps);//获取栈中有效元素个数
bool stempty(st* ps);//栈是否为空

2.源文件

#include"Stack.h"
void stinit(st* ps)// 初始化栈
{
	assert(ps);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;

}
bool stempty(st* ps)//栈是否为空(有效数据(top)为0)
{
	assert(ps);
	return ps->top==0;
}
void stdestroy(st* ps)// 销毁栈
{
	assert(ps);
	if (ps->arr)
		free(ps->arr);
	ps->arr = NULL;//防止成为野指针
	ps->capacity = ps->top = 0;
}
void stpush(st* ps, stdatatype x)// 入栈(只能从栈顶入)
{
	assert(ps);
	if (ps->capacity == ps->top)//如果容量不够就要扩容
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		stdatatype* tmp = (stdatatype*)realloc(ps->arr,sizeof(stdatatype)*newcapacity );
		if (tmp == NULL)
		{
			perror("realloc fail!");
			return 1;
		}
		ps->capacity = newcapacity;
		ps->arr = tmp;
	}
	//出if条件就说明容量足够
	ps->arr[ps->top++] = x;
}
void stpop(st* ps)//出栈
{
	assert(ps);
	assert(!stempty(ps));//如果报错就说明是空栈
	--ps->top;
}
stdatatype stTop(st* ps)//取栈顶元素
{
	assert(ps);
	assert(!stempty(ps));
	return ps->arr[ps->top - 1];
}
int stsize(st* ps)//获取栈中有效元素个数
{
	assert(ps);
	return ps->top;
}

3.一个算法题——有效的括号

在这里插入图片描述

在这里插入图片描述

bool isValid(char* s) {
    st st;
    stinit(&st);
    if(*s=='\0')
    return false;
    else
    {
        while(*s != '\0')
        {
            //如果是左括号就入栈
            if(*s=='['
            ||*s=='{'
            ||*s=='(' )
            {
                stpush(&st, *s);
            }          
            else//左括号全部入栈,然后取栈顶元素和右括号匹配,然后出栈
            { if(stempty(&st))
              { 
                return false;
              }

              if(stTop(&st)=='('&& *s ==')'
              ||stTop(&st)=='{'&& *s =='}'
              ||stTop(&st)=='['&& *s ==']')
               {
                stpop(&st);//出栈
               }
               else{
                return false;
               }
            }
            s++;
        }
        bool ret=stempty(&st);
        stdestroy(&st);// 销毁栈
        return ret;
    }   
}

二、队列

概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先
出FIFO(First In First Out) ​
入队列:进行插入操作的一端称为队尾 ​
出队列:进行删除操作的一端称为队头

在这里插入图片描述

队列底层结构选型
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队
列在数组头上出数据,效率会比较低。

在这里插入图片描述

1.头文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int qudatatype;
typedef struct queuenode {
	qudatatype data;
	struct queuenode* next;
}qunode;
typedef struct queue {
	qunode* phead;
	qunode* ptail;
	int size;//节点个数
}qu;
void quinit(qu* pq);//初始化队列
void qudestroy(qu* pq);//销毁队列
void qupush(qu* pq, qudatatype x);// 入队列,队尾
void qupop(qu* pq);// 出队列,队头
qudatatype qufront(qu* pq);//取队头数据
qudatatype quback(qu* pq);//取队尾数据
bool quempty(qu* pq);//队列判空
int qusize(qu* pq);//队列有效元素个数

2.源文件

#include"Queue.h"
//队列底层是用单链表实现的
void quinit(qu* pq)//初始化队列
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
}
bool quempty(qu* pq)//队列判空
{
	assert(pq);
	return pq->phead == NULL;

}
void qupush(qu* pq, qudatatype x)// 入队列,队尾(单链表尾插)
{
	assert(pq);
	qunode* newnode = (qunode*)malloc(sizeof(qunode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return 1;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	pq->ptail->next = newnode;
	pq->ptail = pq->ptail->next;
	pq->size++;
}
void qupop(qu* pq)// 出队列,队头(单链表头删)
{
	assert(pq);
	assert(!quempty(pq));
	if (pq->phead == pq->ptail)//只有一个节点是,要避免成为野指针
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;		
	}
	pq->phead = pq->phead->next;
}
void qudestroy(qu* pq)//销毁队列
{
	assert(pq);
	assert(!quempty(pq));
	while (pq->phead)
	{
		qunode* Next = pq->phead->next;
		free(pq->phead);
		pq->phead = NULL;
		pq->phead = Next;
	}//出循环时说明全部节点都释放了(除了phead、ptail)
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
int qusize(qu* pq)//队列有效元素个数
{
	assert(pq);
	return pq->size;
}
qudatatype qufront(qu* pq)//取队头数据(取数据时,队列不能为空!)
{
	assert(pq);
	assert(!quempty(pq));
	return pq->phead->data;

}
qudatatype quback(qu* pq)//取队尾数据
{
	assert(pq);
	assert(!quempty(pq));
	return pq->ptail->data;
}

详解都在注释中哦!

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

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

相关文章

极速文件预览!轻松部署 kkFileView 于 Docker 中!

大家好&#xff0c;这几天闲的难受&#xff0c;决定给自己找点事做。博主的项目中有个文件预览的小需求&#xff0c;原有方案是想将文件转换成 PDF 进行预览。本着能借鉴就绝对不自己写的原则。今天就让我们简单试用一下 kkFileView 文件预览服务&#xff0c;一起探索它的强大功…

先导桌面式教育数控 小型数控车床 C59

桌面式教育数控主要指的是在教育领域中使用桌面型数控机床进行教学和培训。这种设备结合了数控技术和小型化设计&#xff0c;使得数控技术的学习和应用变得更加便捷和经济。 桌面式教育数控的主要特点包括&#xff1a; 小型化&#xff1a;机床体积小&#xff0c;重量轻&#x…

Debezium2.7 数据同步 MySQL/Oracle -- AI生成

Debezium是Red Hat开源的一个工具&#xff0c;用于实时捕获多种数据源&#xff08;包括MySQL、PostgreSQL、SQL Server、Oracle等&#xff09;的变更数据&#xff0c;并将这些数据作为事件流输出到Kafka等消息中间件中。通过Debezium&#xff0c;可以实现数据的实时同步和变更数…

Vue组件库Element和Vue路由

目录 一、Vue组件库Element&#xff08;学会怎么CV&#xff09; 快速入门 ElementUI的常用组件 1.Table表格 &#xff08;1&#xff09;组件演示 &#xff08;2&#xff09;组件属性详解 2.Pagination分页 &#xff08;1&#xff09;组件演示 &#xff08;2&#xff0…

易企秀Html5场景秀系统源码 海量模版可以选择 带源代码包以及搭建部署教程

系统概述 易企秀 HTML5 场景秀系统源码是基于 PHPMySQL 组合开发的一套强大的 H5 页面制作系统。它旨在满足企业和个人对于个性化 H5 页面制作的需求&#xff0c;无论是企业宣传、活动推广、产品展示还是邀请函制作等&#xff0c;都能通过该系统轻松实现。 该系统的核心优势在…

智能优化算法-森林优化算法(FOA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 森林优化算法 (Forest Optimization Algorithm, FOA) 是一种基于自然生态系统的元启发式优化算法&#xff0c;它模拟了森林生态系统中的植物生长、竞争和合作等行为&#xff0c;用于解决复杂的优化问题。 FOA的…

uniapp中 使用 VUE3 组合式API 怎么接收上一个页面传递的参数

项目是uniapp &#xff0c;使用了vue3 vite // 使用的组合式API 的 语法糖 <script setup> // 无法使用 onLoad <script> 使用不了下面方法获得上一个页面参数传递 onLoad(options){ } 解决方案1&#xff08;亲测Ok&#xff09;&#xff1a;消息通知与监听…

计算机毕业设计选题推荐-岗位招聘数据可视化分析-Python爬虫

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Android12 显示框架之Transaction----server端

目录&#xff1a;Android显示终极宝典 上篇讲完了在client端Transaction的内容&#xff0c;最后调用setTransactionState()把所有的参数都交给了surfaceflinger&#xff0c;那么任务就交给server来完成了。本节我们一起接着看看下面的内容。 setTransactionState() //framew…

SQL手工注入漏洞测试(MongoDB数据库)

此次靶场地址为&#xff1a;墨者学院 ⼀. 如下给出的源码...可以看到数据库查询的语句如下..构造回显测试... new_list.php?id1});return ({title:1,content:2 ⼆.成功显示“ 1” 和“ 2” 。可以在此来显示想要查询的数据。接下来开始尝试构造payload查询 当前数据库。通过…

Python基础知识学习总结(七)

文章目录 一. 函数1. 定义函数2. 语法及实例3. 函数调用4. 参数传递5. 可更改与不可更改对象6. 传可变对象实例 二. 文件I/O1. 定义2. File对象的属性3. open 函数4. write()方法5. read()方法6. 文件定位 一. 函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实…

【微服务】SpringCloud Alibaba 10-14章

10 SpringCloud Alibaba入门简介 10.1 是什么 诞生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央库发布了第一个版本。 Spring Cloud Alibaba 介绍 10.2 能干嘛 https://github.com/alibaba/spring-cloud-al…

芯片后端之 PT 使用 report_timing 产生报告 之 -nets 选项

今天&#xff0c;我们再学习一点点 后仿真相关技能。 那就是&#xff0c;了解 report_timing 中的 -nets 选项 。 如果我们仅仅使用如下命令&#xff0c;执行后会发现&#xff1a; pt_shell> report_timing -from start_point -to end_point -delay_type max report_ti…

JavaScript(31)——内置构造函数

构造函数 构造函数是一种特殊的函数&#xff0c;主要用于快速初始化对象 用大写字母开头只能由new操作符来执行 function Stu(name, age) {this.name namethis.age age}const xiaom new Stu(小明, 18)const xiaoh new Stu(小红, 19)console.log(xiaom);console.log(xiaoh…

catkin_make 编译报错CMake Error at /opt/ros/noetic/share/catkin/cmake/的最全解决办法,包治百病

检索&#xff08;解决安装了Anaconda后catkin_make不能用了&#xff0c;CMake Error at /opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):Could not find a package configuration file provided by "serial" with any&#xff0c;Invokin…

Stable Diffusion AI绘画工具的安装与配置(MAC用户)

AI绘画的热潮席卷了整个创意行业&#xff0c;Stable Diffusion作为其中的翘楚&#xff0c;让艺术创作变得前所未有的简单。然而&#xff0c;对于使用Mac电脑用户来说&#xff0c;安装和配置Stable Diffusion可能显得有些棘手。别担心&#xff0c;这份详细的教程将手把手教你如何…

ARM——驱动——Linux启动流程和Linux启动

一、flash存储器 lash存储器&#xff0c;全称为Flash EEPROM Memory&#xff0c;又名闪存&#xff0c;是一种长寿命的非易失性存储器。它能够在断电情况下保持所存储的数据信息&#xff0c;因此非常适合用于存储需要持久保存的数据。Flash存储器的数据删除不是以单个的字节为单…

Cetos7安装详细流程

CentOS 7是一个流行的Linux发行版&#xff0c;广泛用于服务器和桌面环境。以下是在物理机或虚拟机上安装CentOS 7的详细步骤&#xff1a; 准备工作 下载CentOS 7 ISO&#xff1a;访问CentOS官方网站下载CentOS 7的ISO镜像文件。 创建启动介质&#xff1a;使用ISO镜像文件创建…

how to connect the VRTE to Internet

Are all gen_swp_fb python dependecies installed? In the build log it is present a fail of gen_swp_fb tool? Steps: Configure the VM according to proxy/no-proxy$ cd ../vrte/project/AraUCM_SwUpdate/gen_swp_fb/$ python3 -m pip install -r requirements.txtR…

普元EOS-利用热更新(热启动)提高开发效率

1 简介 在程序开发的时候&#xff0c;需要频繁的重启项目&#xff0c;随着项目复杂度增加&#xff0c;项目启动时间会越来越长。那么每次修改一点内容就重启项目&#xff0c;会极大影响开发效率。 EOS提供了热更新的手段&#xff0c;代码修改后无须重启&#xff0c;自动生效的…