嘉明的数据结构学习Day5——作栈和队列以及它们的顺序存储与链式存储的实现

news2024/11/27 2:40:36

栈与队列是什么

栈和队列其实就是操作受限制的线性表。
下面来复习一下线性表的概念
具有n个相同类型元素的有限序列

有的人就会问,那么它们受限在哪里呢?
:只允许一段插入和删除。
队列:只允许一端插入一端删除。

前面说了栈是一种受限的线性表,因为它只允许插入和删除操作都在一端进行。
栈的专业术语
栈顶:即允许插入和删除的一端
栈底:即不允许删除和插入的一端
空栈:栈中不包含任何元素
LIFO后进先出 or FILO先进后出
例子:弹夹、烤串

栈的基本操作

初始化空栈栈
判断是否为空栈
出栈
入栈
读取栈顶元素

顺序栈的实现

顺序栈其实就是顺序表的简化版,它只可以在一端插入和删除。代码和顺序表其实大致相同
在这里插入图片描述

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

#define Maxsize 50

typedef int Elemtype;

typedef struct {
	Elemtype data[Maxsize];
	int top;
}sqStack;

//初始化栈
void InitStack(sqStack& s) {
	s.top = -1;
}

//判断栈是否为空(因为只是读取栈里面的元素,所以不用&)
bool IsEmpty(sqStack s) {
	if (s.top == -1) {
		return false;
	}
	return true;
}

//判断栈是否为满
bool IsFull(sqStack s) {
	if (s.top == Maxsize - 1) {
		return false;
	}
	return true;
}

//入栈
bool Push(sqStack& s,Elemtype x) {
	//判断栈是否为满
	if (IsFull(s)) {
		//x是要插入的元素
		s.data[++s.top] = x;
	}
	return true;
}

//出栈(因为x的需要改变,所以要加&)
bool Pop(sqStack& s,int &x) {
	//s是栈,x是出栈的元素
	//判断栈是否为空
	if (IsEmpty(s)) {
		//x是出栈的元素
		x = s.data[s.top--];
	}
	return true;
}

//输出栈
void printfStack(sqStack& s) {
	for (int i = 0; i <= s.top; i++) {
		printf("%d", s.data[i]);
	}
	printf("\n");
}

//读取栈顶元素
int top(sqStack s,int& x) {
	//判断栈是否为满
	if (IsEmpty(s)) {
		//x是出栈的元素
		x = s.data[s.top];
	}
	return x;
}

int main() {
	sqStack s;
	InitStack(s);
	Elemtype x;
	scanf("%d", &x);
	while (x != 9999) {
		Push(s, x);
		scanf("%d", &x);
	}
	printfStack(s);
	int p;
	Pop(s,p);
	printfStack(s);
	printf("出栈元素为:%d\n",p);
	printf("栈顶元素为:%d\n", top(s,p));
}

在这里插入图片描述

栈的链式实现

其实栈的链式存储其实就是只有头插法的链表,不过在删除上面只可以删除链表的表头指向的下一个元素
在这里插入图片描述

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

typedef int ElemType;
//定义链表的结点,链表中逻辑相邻的两个元素物理位置不相邻
typedef struct LNode {
	ElemType data;//数据域
	struct LNode* next;//指针域
}LNode, * LinkList;//别名


//头插法,即从头结点后面插入。比如输入的是12345,插入之后可能顺序就是54321
//也就是进栈的方式
LinkList creatList_Head(LinkList& L) {
	LNode* s;//定义要插入的指针
	int x;//定义需要插入的数据域
	L = (LinkList)malloc(sizeof(LNode));//头结点,没有数据域(默认值)。用于表明这是指针
	L->next = NULL;//因为头结点的指向下一个结点,但是还没定义所以是NULL
	scanf("%d", &x);
	//使用9999作为中止循环的结束符
	while (x != 9999) {
		s = (LinkList)malloc(sizeof(LNode));//申请空间创建新的结点
		s->data = x;//把数据赋值给插入结点的数据域
		s->next = L->next;//把指针指向的下一个结点赋给插入的结点的指针(头插法)
		L->next = s;//然后再把指针指向的结点指向插入的结点
		scanf("%d", &x);//再次读取数据知道x等于9999为止
	}
	return L;
}

//入栈操作(跟头插法一样)
bool Push(LinkList L,ElemType x){
	//因为链表的结点可以不断的加,所以这里没有限制条件
	LinkList s = (LinkList)malloc(sizeof(LNode));
	s->data = x;
	s->next = L->next;
	L->next = s;
	return true;
}

//出栈操作
bool Pop(LinkList L, int& x) {
	//获取头结点的下一个位置只在这里操作
	LinkList s = L->next;
	//判断是否为空栈
	if (s != NULL) {
		x = s->data;
		L->next = s->next; 
		free(s);
		s->next = NULL;
	}
	return true;
}

void PrintfStack(LinkList L) {
	LinkList s;
	s = L->next;
	while (s!= NULL) {
		printf("%d", s->data);
		s = s->next;
	}
	printf("\n");
}

void GetTop(LinkList L) {
	LinkList top = L->next;
	printf("栈顶元素为:%d\n", top->data);
}
int main() {
	LinkList St;
	creatList_Head(St);
	//入栈
	printf("入栈\n");
	Push(St, 5);
	printf("入栈后的栈:");
	PrintfStack(St);
	//出栈
	printf("出栈\n");
	int x;
	Pop(St, x);
	printf("出栈元素为:%d\n", x);
	printf("出栈后的栈:");
	PrintfStack(St);
	//获取栈顶元素
	GetTop(St);
}

在这里插入图片描述

队列

队列也是一种受限的线性表,它只允许一端进行插入操作、另一端进行删除操作。

队列的专业术语
队头:允许删除的一端
队尾:允许插入的一端
空队列:队列中无任何元素
FIFO先进先出 or LILO后进后出
例子:告诉公路的收费站、饭堂排队

队列的操作

初始化队列
判断是否为空队列
出队
入队
读取队头元素

队列的顺序存储

队列的链式存储

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

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

相关文章

巧用千寻位置GNSS软件| 桥台锥坡放样操作技巧

桥台锥坡放样是针对道路施工中&#xff0c;路桥结合部桥台圆锥形斜坡面进行放样设计的专用程序。本期将给大家介绍如何使用千寻位置GNSS软件实现快速完成桥台锥坡放样。 点击【测量】->【桥台锥坡放样】&#xff0c;从线路库中选择桥台经过的线路或是单独增加桥台 锥坡放样&…

利用sampleini库实现c/c++操作ini配置文件

github sampleini库下载链接: https://github.com/brofield/simpleini 下载后只需一下三个文件即可: 配置文件格式:采用以下格式; 1. 加载配置文件前重要设置 /*设置是否使用utf8编码作为加载/保存; 在ini数据被加载后不可设置; 默认true;*/ void SetUnicode(bool a_bIsUtf8 …

【C++】18.哈希

1.unordered_set和unordered_map 使用与set和map的用法一样 #include <iostream> #include <unordered_map> #include <unordered_set> #include <map> #include <set> #include <string> #include <vector> #include <time.h&…

QImage 如何设置图片的透明度

最近遇到了一些这样的需求&#xff0c;在窗口可以调节显示图片的透明度&#xff0c;但是不能影响其他图片。一个窗口显示的图片并不是一张&#xff0c;而是多张通过绘制的形式叠加起来的。可以理解为类似图层。 就像下面这个组合一样&#xff0c;想法是在拖动右侧透明度的滑条…

ACM MM23 Workshop|多媒体+无人机

摘要&#xff1a; 无人驾驶飞行器 (UAV)&#xff0c;也称为无人机&#xff0c;由于能够从空中捕获高质量的多媒体数据&#xff0c;近年来变得越来越流行。 随着航空摄影、电影摄影和测绘等多媒体应用的兴起&#xff0c;无人机已成为收集丰富多样的多媒体内容的强大工具。 本次…

elasticsearch结构化查询

在上一篇中我们介绍了DSL相关的知识&#xff0c;接下来我们将会学习elasticsearch的结构化查询&#xff0c;同时也实践一下上一篇的DSL的查询用法 什么是结构化搜索? 从《Elasticsearch权威指南》上摘取部分解释如下: 结构化搜索是指查询包含内部结构的数据。日期&#xff0…

当我们在谈论ChatGPT时,我们在谈论什么?

当我们在谈论ChatGPT时&#xff0c;我们在谈论什么&#xff1f; 文章目录 当我们在谈论ChatGPT时&#xff0c;我们在谈论什么&#xff1f;一、介绍GPT-4相比GPT-3.5有何不同呢1.交谈能力2.多语言翻译精确度3.视觉输入 二、应用领域1.小镇做题家 (学术研究)2.Cosplay&#xff0c…

优思学院|质量大师的那些名言(三)【质量是一种习惯】

格言是一种简洁明了、简练有力的表达方式&#xff0c;通常蕴含着深刻的哲理和智慧&#xff0c;能够为我们提供指导和启示。 在《质量大师的那些名言》系列中&#xff0c;优思学院将透过这些名言&#xff0c;用最简单、直接、深刻的方式教授质量和六西格玛管理。 概述 在现代商…

ChatGPT 目前到底能帮助我们程序员做什么?

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

异常中断处理

异常或中断是用户程序中最基本的一种执行流程或形态。这部分主要对ARM架构下的异常中断做详细说明。 ARM一共有7种类型的异常&#xff0c;按优先级从高到低的排列如下&#xff1a; 复位异常&#xff08;Reset&#xff09;、数据异常&#xff08;Data Abort&#xff09;、快速…

工业和信息化部发布《关于电信设备进网许可制度若干改革举措的通告》

按照《国务院办公厅关于深化电子电器行业管理制度改革的意见》&#xff08;国办发〔2022〕31号&#xff09;要求&#xff0c;工业和信息化部发布《关于电信设备进网许可制度若干改革举措的通告》&#xff08;工信部信管函〔2023〕14号&#xff09;&#xff0c;集中公布动态调整…

2023,你了解Kafka吗?深入详解

- 消息队列的核心价值 - 解耦合。 异步处理 例如电商平台&#xff0c;秒杀活动。一般流程会分为&#xff1a;1: 风险控制、2&#xff1a;库存锁定、3&#xff1a;生成订单、4&#xff1a;短信通知、5&#xff1a;更新数据。 通过消息系统将秒杀活动业务拆分开&#x…

**MySQL关联查询七种方式详解与应用实例**,你的掌握了吗

当我们需要从多个表中查询数据时&#xff0c;就需要使用关联查询了。MySQL支持七种不同类型的关联查询&#xff1a;内连接、左连接、右连接、全外连接、交叉连接、自连接和自然连接。本文将讲解这七种关联查询的SQL语句、示例以及应用场景。 一、 前言 关联查询是数据库操作中…

Leetcode 37 解数独

Leetcode解数独 题目描述题解1(按Board行列回溯&#xff1a;较直接) 题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次数字 1-9 在每一列只能出现一次数字 1-9 在每一个以粗实线分隔的…

postgresql|数据库|批量执行SQL脚本文件的shell脚本

前言&#xff1a; 对于数据库的维护而言&#xff0c;肯定是有SQL脚本的执行&#xff0c;例如&#xff0c;某个项目需要更新&#xff0c;那么&#xff0c;可能会有很多的SQL脚本需要执行&#xff0c;SQL脚本可能会包含有建表&#xff0c;插入数据&#xff0c;索引建立&#xff…

Vue项目的性能优化

前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术&#xff0c;帮我们处理了前端开发中最脏最累的 DOM 操作部分&#xff0c; 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM&#xff1b;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题&#xff0c;所…

Towards Principled Disentanglement for Domain Generalization

本文用大量的理论论述了基于解纠缠约束优化的域泛化问题。 这篇文章认为以往的文章在解决域泛化问题时所用的方法都是non-trivial的&#xff0c;也就是说没有作严格的证明&#xff0c;是不可解释的&#xff0c;而本文用到大量的定理和推论证明了方法的有效性。 动机 因为域泛…

客户管理系统的作用有哪些?

阅读本文您将了解&#xff1a;1.客户管理系统的作用&#xff1b;2.客户管理系统软件怎么用&#xff1b;3.客户管理的注意事项。 一、客户管理系统的作用 客户是企业的重要财富&#xff0c;因此客户管理是企业发展过程中至关重要的一部分&#xff0c;那么客户管理怎么做&#…

把字符串转换成整数

题目&#xff1a;把字符串转换成整数 思路&#xff1a; 如果对于一般规则的数字“字符串”转化为数字都很容易&#xff0c;比如&#xff1a; 对于“123456”可以利用如下代码进行转化&#xff1a; string str"123456"; int ans 0; for (int i0; i<str.size(); …

Elesticesearch

1. 概述 应用场景&#xff1a; 给你一个巨大的文档数据&#xff0c;文档中存储着许多非结构化的数据&#xff0c;如下&#xff1a; {“id” : “1”, “name” : “佛山张学友”, “age” : “15”}, {“name” : “广州周润发”, “height” : “182”}, …中间有10000万行……