数据结构入门————栈和队列(C语言/零基础/小白/新手+模拟实现+例题讲解)

news2024/7/4 5:29:38

目录

1.栈的概念

   ​编辑

2.栈的作用

        1.函数递归

        2.表达式求值

3.栈的模拟实现

Stack.h

Stack.c

4.队列的概念

5.队列的模拟实现

 Queue.h

Queue.c

6.例题

        1.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是(B )。

        2.若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是(C)

        3.以下( B)不是队列的基本运算?


1.栈的概念

        栈:是一种特殊的线性表,只允许固定的一端进行插入和删除操作。进行插入和删除的一端叫做栈顶,另一端叫做栈顶。栈中的数据元素遵守后进先出原则LIFO(Lats In Fast Out)。

        压栈:栈的插入操作,也叫入栈/进栈,压栈操作在栈顶进行的。

        出栈:栈的删除操作,也叫弹栈,出栈操作也是在栈底进行的。

   

2.栈的作用

        1.函数递归

        2.表达式求值

        这里知识简单罗列出栈的简单应用,大家可以去B站上看相关视频,会比文章学起来更加轻松。

21_2.2.4 堆栈应用_表达式求值_哔哩哔哩_bilibili

第05周11--3.4栈和递归_哔哩哔哩_bilibili

3.栈的模拟实现

        栈的实现可以是链式栈,也可以是顺序栈,相对而言顺序结构的实现更优一些,所以本文是基于顺序栈来实现的。

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 top;
	int capacity;
}ST;

//初始化
void StackInit(ST* pst);

//销毁
void StackDestroy(ST* pst);

//添加
void StackPush(ST* pst, STDataType x);

//删除
void StackPop(ST* pst);

//top值
STDataType StackTop(ST* pst);

//有效元素个数
int StackSize(ST* pst);

//判断是否为空
bool StackEmpty(ST* pst);

Stack.c

#include "Stack.h"

//初始化
void StackInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->top = 0;
	pst->capacity = 0;
}

//销毁
void StackDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}

//添加
void StackPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
		STDataType* temp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (temp == NULL)
		{
			perror("realloc");
			return;
		}
		pst->a = temp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}

//删除
void StackPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	pst->top--;
}

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

//有效元素个数
int StackSize(ST* pst)
{
	assert(pst);

	return pst->top;
}

//判断是否为空
bool StackEmpty(ST* pst)
{
	
	assert(pst);
	return pst->top == 0;
}

4.队列的概念

        队列:也是一种特殊的线性表,要求只能一端进行插入操作,另一端进行删除操作,遵循先入先出原则FIFO(First In First Out)。

        入队列:进行插入的一端叫做队头。

        出队列:进行删除的一端叫队尾。

5.队列的模拟实现

        队列的实现也可以基于链式结构或顺序结构,但是用链式结构效率更高,使用顺序结构,进行插入操作效率较低。本文基于链式结构实现队列。

 Queue.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int QNDataType;

typedef struct QueueNode
{
	QNDataType data;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

//初始化
void QueueInit(Queue* pq);

//插入
void QueuePush(Queue* pq, QNDataType x);

//删除
void QueuePop(Queue* pq);

//获取头部元素
QNDataType QueueFront(Queue* pq);

//获取尾部元素
QNDataType QueueBack(Queue* pq);

//元素个数
int QueueSize(Queue* pq);

//判断是否为空 
bool QueueEmpty(Queue* pq);

//销毁
void QueueDestroy(Queue* pq);

Queue.c

#include "Queue.h"

//初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

//插入
void QueuePush(Queue* pq, QNDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("mallloc");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->ptail == NULL)
	{
		pq->ptail = pq->phead = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

//删除
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->phead);
	QNode* del = pq->phead;
	pq->phead = pq->phead->next;
	free(del);
	del = NULL;
	pq->size--;
	if (pq->phead == NULL)
	{
		pq->ptail = NULL;
	}
}

//获取头部元素
QNDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);
	return pq->phead->data;
}

//获取尾部元素
QNDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->phead);
	return pq->ptail->data;
}

//元素个数
int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

//判断是否为空 
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->phead == NULL;
}

//销毁
void QueueDestroy(Queue* pq)
{
	assert(pq);
	/*while (!QueueEmpty(pq))
	{
		QueuePop(pq);
	}*/
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

6.例题

        1.一个栈的初始状态为空。现将元素12345ABCDE依次入栈,然后再依次出栈,则元素出栈的顺序是(B )。

A 12345ABCDE

B EDCBA54321

C ABCDE12345

D 54321EDCBA
解析:如果你认真阅读并实现本文以上代码,这道题对你一定非常加单,12345ABCDE依次进栈,再依次出栈,顺序一定是B选项

     

        2.若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是(C

A 1,4,3,2

B 2,3,4,1

C 3,1,4,2

D 3,4,2,1

解析:这道题是对上面那道题的一点小小升级,结题方法就是依次试试,经过验证,对于C选项,如果1想出栈,那么2,4必须先出栈。

        3.以下( B)不是队列的基本运算?

A 从队尾插入一个新元素

B 从队列中删除第i个元素

C 判断一个队列是否为空

D 读取队头元素的值

解析:这道就是一个非常经典的概念题,把握好概念,队列只能一端进行插入,另一端进行删除,不支持随机访问,想要访问i节点,必须把i之前的节点出队列。

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

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

相关文章

如何把小米路由器刷入OpenWRT系统并通过内网穿透工具实现公网远程访问

小米路由器4A千兆版刷入OpenWRT并远程访问 文章目录 小米路由器4A千兆版刷入OpenWRT并远程访问前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理…

LeetCode | 225. 用队列实现栈

LeetCode | 225. 用队列实现栈 OJ链接 此题可以用两个队列去实现一个栈&#xff0c;每次始终保持一个队列为空&#xff0c; 入栈操作相当于给非空队列进行入队操作 入数据&#xff0c;把不为空的队列入 出数据&#xff0c;把不为空的队列数据导入为空&#xff0c;直到最后一…

如何将微软 Office 宏转换为 ONLYOFFICE 宏

想要将微软 Office VBA 宏转换为可在 ONLYOFFICE 中无缝使用的宏&#xff1f;嗯&#xff0c;虽然这种需求并没有直接的解决方案&#xff0c;不过我们也会在本文中介绍 VBA 宏的转换步骤——正好我们手上也有一个来自用户的实际案例可供参考。 VBA 宏 以下是原始的 VBA 宏代码&…

vscode+python开发之虚拟环境和解释器切换

需求情景&#xff1a; 现在我们要开发多个项目比如&#xff1a;项目A&#xff0c;项目B、项目C&#xff0c;他们每个项目需要依赖不同的库。每个项目依赖的解释器也不一样怎么办&#xff1f; 项目A&#xff1a;需要在python3.7环境运行 依赖aadd3.2库 项目B、需要在python3.11…

〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

No207.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【Python】爬虫代理IP的使用+建立代理IP池

目录 前言 一、代理IP 1. 代理IP的获取 2. 代理IP的验证 3. 代理IP的使用 二、建立代理IP池 1. 代理IP池的建立 2. 动态维护代理IP池 三、完整代码 总结 前言 在进行网络爬虫开发时&#xff0c;我们很容易遭遇反爬虫机制的阻碍。为了规避反爬虫机制&#xff0c;我们…

R语言爬虫程序自动爬取图片并下载

R语言本身并不适合用来爬取数据&#xff0c;它更适合进行统计分析和数据可视化。而Python的requests&#xff0c;BeautifulSoup&#xff0c;Scrapy等库则更适合用来爬取网页数据。如果你想要在R中获取网页内容&#xff0c;你可以使用rvest包。 以下是一个简单的使用rvest包爬取…

tensorflow 1.15 gpu docker环境搭建;Nvidia Docker容器基于TensorFlow1.15测试GPU;——全流程应用指南

前言: TensorFlow简介 TensorFlow 在新款 NVIDIA Pascal GPU 上的运行速度可提升高达 50%&#xff0c;并且能够顺利跨 GPU 进行扩展。 如今&#xff0c;训练模型的时间可以从几天缩短到几小时 TensorFlow 使用优化的 C 和 NVIDIA CUDA 工具包编写&#xff0c;使模型能够在训练…

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件 2023/11/14 14:11 手机&#xff1a;Realme Q 笔记本电脑&#xff1a;HP https://item.jd.com/100012583174.html 惠普&#xff08;HP&#xff09;战66 三代AMD版 14英寸轻薄笔记本电脑&#xff08;锐龙7nm 六核…

旺店通·企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口

旺店通企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口 源系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌&#xff0c;国内的零售云服务提供商&#xff0c;基于云计算SaaS服务模式&#xff0c;以体系化解决方案&#xff0c;助力零售企业数字化…

Qt QWebEngine 加载网页及交互,实现C++与JS 相互调用

目录 前言1、QtWebEngine介绍2、安装3、核心类介绍3.1 QWebEngineView3.2 QWebEnginePage3.3 QWebEngineProfile3.4 QWebEngineHistory3.5 QWebEngineSettings 4、加载网页5、C调用JS5.1 无返回值5.2 有返回值 6、JS调用C6.1 新建WebObject 类继承自QObject。6.2 将WebObject对…

前端入门(二)js速成与vue脚手架搭建

文章目录 JS常用API操作对象操作对象增删改查js深拷贝、浅拷贝js实现深拷贝的方式 安全访问 JS常用API操作 对象操作 对象增删改查 创建对象 let obj {}新增属性 obj.a 1 、obj[a] 1修改属性 obj.a ‘a’查询属性 obj.a 、obj[a]删除属性 delete obj.a js深拷贝、浅拷贝…

day08_子网划分与子网掩码

什么是子网划分? 1、概念&#xff1a;借主机位给网络位使用,以此来达到把一个大网段划分为n个儿子网段的目的&#xff0c;2. 为何要进行子网划分&#xff1f;3、子网掩码&#xff1a;就是对ip地址打记号4、 网络地址的计算机方式&#xff1a;ip地址与子网掩码都转换成二进制&a…

如何实现Redisson分布式锁

首先&#xff0c;不要将分布式锁想的太复杂&#xff0c;如果我们只是平时业务中去使用&#xff0c;其实不算难&#xff0c;但是很多人写的文章不能让人快速上手&#xff0c;接下来&#xff0c;一起看下Redisson分布式锁的快速实现 Redisson 是一个在 Redis 的基础上实现的 Java…

Postman配置环境请求接口

一、准备配置dev、test、demo、eprod 二、使用切换环境变量调用接口 三、使用登录接口自动获取token

python数据处理作业11:建一个5*3的随机数组和一个3*2的数组,其元素为1,2,3,4,5,6,求两矩阵的积

每日小语 打碎的杯子&#xff0c;烫伤的手&#xff0c;对菩萨是堪忍&#xff0c;因为他在里面得悟甚深之法&#xff0c;心生欢喜。 可是对一般人来说&#xff0c;一生何止打破千百个杯子&#xff1f;何止烫伤过千百次手&#xff1f;他只是痛苦地忍受&#xff0c;只记得下次要…

创建具有负载平衡和集群的可扩展 Node.js 应用程序

创建具有负载平衡和集群的可扩展 Node.js 应用程序 负载平衡是提高应用程序性能、可扩展性和可用性的一项重要技术。当客户端向负载均衡器发出请求时&#xff0c;负载均衡器根据预定义的规则将请求分发到不同的实例。 可以使用cluster集群模块或 PM2 等工具根据负载均衡器的流…

谈谈一个IT杂家的职业生涯规划,你的护城河被AI 攻破了么

文章大纲 没有顶会的从业者&#xff1a;成为深度学习老中医AIGC 还未能克服的难点&#xff1a;忽然的惊喜 -- 大模型的智能涌现未来还能做点什么&#xff0c;从计算机视觉的发展走向看T 字型人才与护城河成为更加熟练使用人工智能的人 参考文献与学习路径 我的职业生涯将近十年…

【多项式回归】拟合有噪声的正弦曲线

先导入模块并创建数据&#xff1a; from sklearn.preprocessing import PolynomialFeatures as PF from sklearn.linear_model import LinearRegression import numpy as nprnd np.random.RandomState(42) #设置随机数种子 X rnd.uniform(-3, 3, size100) y np.sin(X) rnd…