【黄色手套22】9话:栈和队列

news2025/1/10 16:40:44

 目录

栈和队列的基本概念:

数据结构中的栈和队列:

栈和队列的基本结构:

1.栈和队列的结构示意图

2.栈和队列中数据的插入和删除

 栈和队列的实现:

        栈的实现

栈.c

stack.h

源stack.c

队列的实现

队列.c

queue.h

queue.c


栈和队列的基本概念:

在数组中,我们可以通过索引(下标)访问随机元素。在某些特定情况下,我们需要限制处理顺序,于是,产生了栈和队列这两种功能受限的线性结构。

栈和队列,两种不同的处理顺序,先进后出和先进先出,是两个相应的线性数据结构。

数据结构中的栈和队列:

统一用数组实现功能的话

1. 栈(stack)

数据先进后出,后进先出:LIFO(last in first out)

栈只有一个开口,先进去的就到下面,后进来的就在上面(top);要是拿出去的话,肯定从开口端拿出去,所以说是后进先出,先进后出。

        入栈:push

        出栈:pop

        获取栈顶元素:top

        判断栈是否已经为满:is_full

        判断栈是否已经为空:is _empty

2. 队列(queue)

数据入队规则:先进先出,后进后出:FIFO(first in first out)

队列有队首(front)和队尾(back),数据从队尾入队,从队首出队。

队头(front)指向队列的第一个数据,队尾(back)指向队列中的最后一个数据。

        入队:push

        出队:pop

        队首:front

        队尾:back

栈和队列的基本结构:

1. 栈和队列的结构示意图

 2. 栈和队列中数据的插入和删除     

         栈

         队列

栈和实现:    

 stack.h

栈的头文件
    :头文件用于数据类型的声明和功能函数的声明

#pragma once      防止头文件重复包含(vs)

#ifndef STACK     防止头文件重复包含
#define STACK

#define _CRT_SECUTE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

栈的数组实现

typedef int Type;         给数据类型取别名,方便一改全改
#define STACK_P "%d\t"
#define STACK_S "%d"

栈结构的声明
#define STACK_SIZE 10     栈的最大大小

typedef struct Stack{
	Type data[STACK_SIZE];     栈的数据域
	int top;                   栈顶元素下标
}stack;

栈功能的声明

数据入栈函数
void stack_push(Type data[], int *top, Type value);

数据出栈函数
Type stack_pop(Type data[], int *top);

获取栈顶元素
Type stack_top(Type data[], int top);

判断栈满函数
int stack_full(int top);

判断栈空函数
int stack_empty(int top);

#endif

    

源stack.c

#include"stack.h"

数据入栈函数
void stack_push(Type data[], int *top, Type value)
{
	if (stack_full(*top))
	{
		printf("栈满了,数据入栈失败\n");
		return;
	}
	data[++*top] = value;     向栈顶插入数据元素 
}


数据出栈函数
Type stack_pop(Type data[], int *top)
{
	if (stack_empty(*top))
	{
		printf("栈空了,数据出栈失败\n");
		return -1;
	}
	return data[(*top)--];     返回栈顶元素,栈顶标记-1
}

获取栈顶元素
Type stack_top(Type data[], int top)
{
	if (stack_empty(top))
	{
		printf("栈空了,获取栈顶元素失败\n");
		return-1;
	}
	return data[top];
}

判断栈满函数
int stack_full(int top)
{
	//if (top >= STACK_SIZE - 1)return 1;     栈满了
	//return 0;                               栈没满
	return top >= STACK_SIZE - 1;
}

判断栈空函数
int stack_empty(int top)
{
	return -1 == top;     -1表示栈中没有数据,栈为空
	                       返回1.否则返回0
}

栈.c

#include<stdio.h>
#include"stack.h"     包含栈功能函数的头文件

多文件编程

栈功能的测试函数
void stack_test();

int main(){
	stack_test();
	return 0;
}

void stack_test()
{
	stack s1;		    定义了一个栈
	s1.top = -1;	    初始化栈顶元素下标top的值为-1(-1标识表中没有数据,栈为空)
					    s1.data[s1.top];操作栈顶元素
	Type values = 0;

	do{
		scanf(STACK_S, &values);
		stack_push(s1.data, &s1.top, values);
	} while ('\n' != getchar());

	printf(STACK_P, stack_top(s1.data, s1.top));

	while (!stack_empty(s1.top))
	{
		printf(STACK_P, stack_pop(s1.data, &s1.top));
	}
	putchar('\n');
}

  

       

队列的实现:

 queue.h

#pragma once         vs
#ifndef QUEUE
#define QUEUE

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

队列的实现
typedef int Type;     给数据类型取别名,方便一改全改
#define QUEUE_P "%d\t"
#define QUEUE_S "%d"
#define QUEUE_Pn "%d\n"

队列结构的声明
#define QUEUE_SIZE 10     队列的最大大小

typedef struct Queue{
	Type data[QUEUE_SIZE];     队列的数据域
	int rear;     队尾元素下标
}queue;

队列功能的声明

数据入队函数
void queue_push(Type *data, int *rear, Type value);     Type data[]也是一样的

数据出队函数
Type queue_pop(Type *data, int *rear);

判断队满函数
int queue_full(int rear);

判断队空函数
int queue_empty(int rear);

#endif

源queue.c

#include "Queue.h"

队列功能的实现

数据入队函数
void queue_push(Type* data, int* rear, Type value)
{
	if (queue_full((*rear) - 1))
	{
		printf("队列满了,数据入队失败!\n");
		return;
	}

	data[(*rear)++] = value;
}



数据出队函数
Type queue_pop(Type* data, int* rear)
{
	if (queue_empty((*rear) - 1))
	{
		printf("队列为空,数据出队失败!\n");
		return -1;
	}

	Type value = data[0];     记录队首元素


	for (int i = 0; i < (*rear) ; i++)
	{
		data[i] = data[i + 1];
	}

	(*rear)--;     队尾元素下标-1

	return value;     返回队首元素
}


判断队满函数
int queue_full(int rear)
{
	return rear >= QUEUE_SIZE - 1;
}


判断队空函数
int queue_empty(int rear)
{
	return -1 == rear;
}

队列.c

#include<stdio.h>

#include "Queue.h"     包含队列的功能函数头文件
多文件编程


队列功能的测试函数
void queue_test();

int main(){
	queue_test();
	return 0;
}

void queue_test()
{
	queue q1;
	q1.rear = 0;     队尾下标初始化为0(0表示队列中没有数据)

	Type values = 0;

	do{
		scanf(QUEUE_S, &values);
		queue_push(q1.data, &(q1.rear), values);
	} while ('\n' != getchar());

	printf("队首为%d\t队尾为%d\n\n", q1.data[0], q1.data[q1.rear - 1]);

	while (q1.rear >0)
	{
		printf(QUEUE_P, queue_pop(q1.data, &(q1.rear)));
	}
	putchar('\n');
}

______________#

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

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

相关文章

使用branch and bound分支定界算法选择UTXO

BnB算法原理 分支定界算法始终围绕着一颗搜索树进行的&#xff0c;我们将原问题看作搜索树的根节点&#xff0c;从这里出发&#xff0c;分支的含义就是将大的问题分割成小的问题。 大问题可以看成是搜索树的父节点&#xff0c;那么从大问题分割出来的小问题就是父节点的子节点…

【办公自动化】用Python批量从上市公司年报中获取主要业务信息

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

电力系统优化:数字孪生的革新方法

数字孪生技术在电力系统中能够发挥令人瞩目的作用。这项技术不仅可以提高电力系统的可靠性和效率&#xff0c;还有助于降低能源浪费和环境影响。本文将深入探讨数字孪生技术在电力领域的多个关键应用领域&#xff0c;以展示其潜力和重要性。 数字孪生技术可以创建电力设备的虚拟…

农村怎样利用光伏发电?

随着经济快速发展&#xff0c;光伏、风电等可再生能源在农村地区普及率越来越高&#xff0c;极大推动了农业产业发展&#xff0c;提高了农民收入&#xff0c;改善了农村生态环境&#xff0c;促进了乡村各项工作健康发展。 光伏&#xff0b;农业是一种新兴的农业形式&#xff0…

如何获取美团的热门商品和服务

导语 美团是中国最大的生活服务平台之一&#xff0c;提供了各种各样的商品和服务&#xff0c;如美食、酒店、旅游、电影、娱乐等。如果你想了解美团的热门商品和服务&#xff0c;你可以使用爬虫技术来获取它们。本文将介绍如何使用Python和BeautifulSoup库来编写一个简单的爬虫…

文件上传漏洞~操作手册

目录 上传文件一般过滤方式 客服端校验 服务端校验 黑白名单机制 常规文件上传漏洞绕过 客户端绕过 1.游览器禁用JavaScript 2.正常burp suite抓包改包 服务端绕过 1.Content-Type绕过 2.黑名单绕过 1&#xff09;命名规则绕过 2&#xff09;大小写绕过 3&#x…

jvm的调优工具

1. jps 查看进程信息 2. jstack 查看进程的线程 59560为进程id 产生了死锁就可以jstack查看了 详细用途可以看用途 3. jmap 如何使用dump文件看下 查看 4.jstat 空间占用和次数 5. jconsole可视化工具 各种使用情况&#xff0c;以及死锁检测 6. visualvm可视化工具…

如何使用ArcGIS Pro提取河网水系

DEM数据除了可以看三维地图和生成等高线之外&#xff0c;还可以用于水文分析&#xff0c;这里给大家介绍一下如何使用ArcGIS Pro通过水文分析提取河网水系&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&a…

导入发运地点wsh_locations

当客户上的地址变更之后&#xff0c;发运事务处理上的地址还是原来的地址&#xff0c;发运上的地址来源table wsh_locations. 解决办法&#xff1a;运行接口请求&#xff0c;导入发运地点&#xff0c;日期可以范围包括地点变更的日期。 请求完成后再次查看地址发现地址已变更…

iwebsec靶场 文件包含漏洞通关笔记10-data伪协议利用

目录 前言 1.data伪协议 2.使用条件 第10关 data://伪协议利用 1.打开靶场 2.源码分析 3.渗透 &#xff08;1&#xff09;明文渗透 &#xff08;2&#xff09;base64编码渗透 前言 1.data伪协议 data协议和input协议差不多&#xff0c;指定data是get方法&#xff0c;…

从零基础到精通Flutter开发:一步步打造跨平台应用

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 导言 Flutter是一种流行…

QLabel 显示圆图并且含有边框 border-image

在一个label上流动显示头像&#xff0c;并且不能遮挡边框&#xff08;如头像1-3&#xff09;&#xff0c;不想放两个label堆叠&#xff0c;所以最后采用了下述方法解决 1.设置边框还有图片 2.设置图片自适应 3.将头像切割成圆形 QPixmap pixmap QPixmap::fromImage(img); …

微信创建会员卡-47001错误

文档&#xff1a;1.新版会员卡介绍 | 微信开放文档 错误&#xff1a; 47001解析 JSON/XML 内容错误 接口&#xff1a; HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_tokenACCESS_TOKEN 原因&#xff1a; 参数设置错误&#xff1a;["swipe_car…

JavaScript的基本数据类型如何使用?

JavaScript中的数据类型分为两大类&#xff0c;分别是基本数据类型和复杂数据类型(或称为引用数据类型)&#xff0c;如图所示。 本节重点讲解基本数据类型。下面我们用代码演示基本数据类型的使用。 (1)数字型(Number)&#xff0c;包含整型值和浮点型值: var numl 21; …

清华智能体宇宙火了;主流大语言模型的技术原理细节

&#x1f989; AI新闻 &#x1f680; 清华智能体宇宙火了 摘要&#xff1a;清华大学联合北邮、微信团队推出了AgentVerse&#xff0c;这是一个可以轻松模拟多智能体宇宙的环境。它专为大语言模型开发&#xff0c;智能体可以利用LLM能力完成任务。AgentVerse提供了几个示例环境…

谷歌翻译API接口,翻译API接口,翻译API接口申请指南

Google翻译API是一种可以在多个平台上使用的Web服务&#xff0c;通过使用该API&#xff0c;用户可以将任何文本转换成多种语言&#xff0c;同时也可以将多种语言转换成用户指定的语言。目前Google翻译API支持超过100种语言&#xff0c;涵盖了全球范围内的所有主流语言。 Googl…

gradio的基础教程

接口 gradio.Interface(fn, inputs, outputs, ) 描述 界面是Gradio的主要高级类&#xff0c;允许您在几行代码中围绕机器学习模型&#xff08;或任何Python函数&#xff09;创建基于Web的GUI /演示。您必须指定三个参数&#xff1a;&#xff08;1&#xff09; 为 &#xff08;…

怎么科学管理固定资产呢

在当今的商业环境中&#xff0c;固定资产的管理是企业成功的关键因素之一。然而&#xff0c;传统的固定资产管理方法往往过于繁琐&#xff0c;缺乏创新&#xff0c;导致资源的浪费和效率的低下。因此&#xff0c;我们需要一种新的、更加科学的方法来管理我们的固定资产。本文将…

QT基础教程(GUI程序原理分析)

文章目录 前言一、命令行应用程序的特点二、图形界面应用程序的特点三、图形界面程序适用场景总结 前言 本篇文章正式带大家开始学习QT基础部分的内容&#xff0c;后面将更新一套完整的QT教程&#xff0c;包括QT基础&#xff0c;QT进阶&#xff0c;QT项目&#xff0c;QT企业级…

webpack打包速度优化

优化WebPack打包速度 在开发过程中&#xff0c;WebPack的打包速度是一个非常重要的考虑因素。随着项目规模的增长&#xff0c;打包时间也会越来越长&#xff0c;影响开发效率和用户体验。本文将循序渐进地介绍一些优化WebPack打包速度的方法&#xff0c;先分析打包瓶颈&#x…