考研数据结构:栈与队列

栈与队列

栈Stack

栈的结构体定义及基本操作。

#define MaxSize 50
typedef struct {int data[MaxSize];//栈中存放数据类型为整型int top;//栈顶指针
}Stack;
void InitStack(Stack& S) {//初始化栈S.top = -1;
}
int IsEmpty(Stack S) {//判断栈是否为空if (S.top == -1)return 1;elsereturn 0;
}
int Push(Stack& S, int x) {//压栈操作if (S.top == MaxSize - 1)//若栈满则无法压栈return 0;S.top++;S.data[S.top] = x;return 1;
}
int Pop(Stack& S, int& x) {//出栈操作if (S.top == -1)//若栈空则无法出栈return 0;x = S.data[S.top];S.top--;return 1;
}
int GetTop(Stack S, int& x) {//读取栈顶元素if (S.top == -1)//若栈空则无栈顶元素return 0;x = S.data[S.top];return 1;
}
有一个带头结点的单链表 L,结点结构由 data 和 next 两个域构成,其中data 域为字符型。试设计算法判断该链表的全部 n 个字符是否中心对称。例如xyx、xyyx 都是中心对称。
  1. 结点个数为偶数时,正常处理,个数为奇数时,最中间元素不将其压栈处理,
int central_symmetry(LinkList L) {char S[n / 2];//定义字符型数组作为一个栈int i;//栈顶指针LNode* p = L->next;for (i = 0; i < n / 2; i++) {S[i] = p->data;p = p->next;}i--;//变量i返回栈顶位置if(n%2==1){//奇数个结点p = p->next;}while (p != NULL) {//右半边字符与栈顶元素比较if (p->data == S[i]) {i--;p = p->next;}else {return 0;//非中心对称}}return 1;
}
假设一个算术表达式中包含小括号和中括号 2 种类型的括号,编写一个算法来判别表达式中的括号是否配对,假设算术表达式存放于字符数组中,以字符‘\0’作为算术表达式的结束符。
int BracketsCheck(char a[]) {Stack S;InitStack(S);char x;for (int i = 0; a[i] != '\0'; i++) {switch (a[i]) {case'(':push(S, a[i]);break;case'[':push(S, a[i]);break;case')':if (IsEmpty(S) {return 0;}else {Pop(S, x);if (x != '(') {return 0;}break;}case']':if (IsEmpty(S)) {return 0;}else {Pop(S, x);if (x != '[') {return 0;}break;}default://若数组元素不是括号则直接继续遍历break;}}if (IsEmpty(S)) {return 1;}else {retun 0;}
}
两个栈 S1、S2 都采用顺序栈方式,并共享一个存储区[0,…,MaxSize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式。试设计写出此栈的定义和 S1、S2 有关入栈和出栈的操作算法。
#define MaxSize 50
typedef struct{int data[MaxSize];int top[2];//一个top[0],一个top[1]指针
}DStack;

初始化

void InitDStack(DStack& S) {S.top[0] = -1;S.top[1] = MaxSize;
}

入栈

int push(int i, int x) {if (i < 0 || i>1) {return 0;}if (S.top[1] - S.top[0] == 1) {return 0;}switch (i) {case 0:S.top[0]++;S.data[S.top[0]] = x;//S.data[++S.top[0]] = x;break;case 1:S.top[1]--;S.data[S.top[1]] = x;//S.data[--S.top[1]] = x;break;}return 1;
}

出栈

int pop(int i, int& x) {if (i < 0 || i>1) {return 0;}if (S.top[0] == -1 || S.top[1] == MaxSize) {return 0;}switch (i) {case 0:x = S.data[S.top[0]];S.top[0]--;//x = S.data[S.top[0]--];break;case 1:x = S.data[S.top[1]];S.top[1]++;//x = S.data[S.top[1]++];break;}return 1;
}

队列Queue

队列的结构体定义及其基本操作。

#define MaxSize 50
typedef struct {int data[MaxSize];//队列中存放数据类型为整型int front, rear;//队首指针和队尾指针
}Queue;
void InitQueue(Queue& Q) {//初始化队列Q.front = 0;Q.rear = 0;
}
int IsEmpty(Queue Q) {//判断队列是否为空if (Q.front == Q.rear)//若队首指针和队尾指针指向同一位置,则队列为空return 1;elsereturn 0;
}

队列的入队和出队

这里队尾指针指向元素的后一个位置,详见入队出队操作

//顺序队列的入队和出队:
//这里队尾指针指向元素的后一个位置
int EnQueue(Queue& Q, int x) {//入队操作if (Q.rear == MaxSize)//若队满,则无法入队return 0;Q.data[Q.rear] = x;//变量 x 入队Q.rear++;//队尾指针后移return 1;//入队成功
}
int DeQueue(Queue& Q, int& x) {//出队操作if (Q.front == Q.rear)//若队空,则无法出队return 0;x = Q.data[Q.front];//变量 x 接收出队元素Q.front++;//队首指针后移return 1;//出队成功
}

循环队列

由于之前Q.front == Q.rear判断队空,若循环,则既有判空,又有存满的意思,因此可以牺牲一个空间。

判空:Q.front == Q.rear

判满:(Q.rear + 1) % MaxSize == Q.front(rear向后移一个是front的话,说明满了)

//循环队列的入队和出队:(牺牲一个存储空间)
int EnQueue(Queue& Q, int x) {//入队操作if ((Q.rear + 1) % MaxSize == Q.front)//若队满,则无法入队return 0;Q.data[Q.rear] = x;//变量 x 入队Q.rear = (Q.rear + 1) % MaxSize;//队尾指针后移return 1;//入队成功
}
int DeQueue(Queue& Q, int& x) {//出队操作if (Q.front == Q.rear)//若队空,则无法出队return 0;x = Q.data[Q.front];//变量 x 接收出队元素Q.front = (Q.front + 1) % MaxSize;//队首指针后移return 1;//出队成功
}
若希望循环队列中的元素都能得到利用,则需设置一个标志域 tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。试编写与此结构相应的入队和出队算法。
typedef struct {int data[MaxSize];int front, rear;int tag;
}Queue;
int EnQueue(Queue& Q, int x) {if (Q.front == Q.rear && Q.tag == 1) {return 0;}Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;Q.tag = 1;//入队后可能会出现队满的情况,所以将 tag 标志域置为 1return 1;
}
int DeQueue(Queue& Q, int& x) {if (Q.front == Q.rear && Q.tag == 0) {return 0;//队空}x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;Q.tag == 0;//出队后可能会出现队空的情况,所以将 tag 标志域置为 0return 1;
}
Q 是一个队列,S 是一个空栈,实现将队列中的元素逆置的算法。
//Q 是一个队列,S 是一个空栈,实现将队列中的元素逆置的算法。
void Reverse(Queue& Q, Stack& S) {int x;while (!IsEmpty(Q)) {//出队列入栈DeQueue(Q, x);Push(S, x);}while (!IsEmpty(S)) {//出栈入队列Pop(S, x);EnQueue(Q, x);}
}

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

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

相关文章

一文读懂 Pencil 积分,打开 Pencils Protocol 生态权益大门

近日&#xff0c;Scroll 生态项目 Penpad 近期将品牌全新升级为 Pencils Protocol &#xff0c;在升级后&#xff0c;其从一个 Scroll 生态的原生 LaunchPad 平台进一步拓展为集 Staking、Vault 以及 Shop 等功能于一体的全新生态。全新的品牌升级不仅让 Pencils Protocol 生态…

ubuntu18.04系统安装pangolin

1. 安装pangolin依赖项 ctrlaltt 打开终端&#xff0c;依次输入下面的命令 sudo apt update sudo apt upgrade sudo apt install libglew-dev cmake libboost-dev libboost-thread-dev libboost-filesystem-dev libeigen3-dev -y 2.在终端中输入下面的命令&#xff0c;克隆…

2024 年第一季度全球互联网中断事件

2024 年第一季度伊始&#xff0c;互联网发生了多起中断事件。陆地和海底电缆的损坏在多个地方造成了问题&#xff0c;而与持续中地缘政治冲突相关的军事行动影响了其他地区的连接。 几个非洲国家以及巴基斯坦的政府下令关闭互联网&#xff0c;主要针对移动网络连接。 被称为Ano…

Pyqt中QThread传递自己定义的参数、类、函数

Pyqt中QThread传递自己定义的参数、类、函数 1 pyqt中Qthread传递自己定义的参数2 pyqt中Qthread传递自己定义的类3 pyqt中Qthread传递自己定义的函数4 pyqt中Qthread内部定义自己的函数5 pyqt中Qthread传递参数到内部定义自己的函数 1 pyqt中Qthread传递自己定义的参数 在PyQ…

Android开发adb命令使用大全

Android开发中&#xff0c;adb&#xff08;Android Debug Bridge&#xff09;是一个多功能命令行工具&#xff0c;它允许你与连接的Android设备进行通信。以下是一些常用的adb命令及其用途的详细列表&#xff1a; 基本设备管理 adb devices&#xff1a;列出所有连接的设备和模拟…

(四)Spring教程——控制反转或依赖注入与Java的反射技术

IoC的底层实现技术是反射技术&#xff0c;目前Java、C#、PHP 等语言均支持反射技术。 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够获取到这个类的所有属性和方法&#xff1b;对任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff08;包括私有的方法…

python的标准数据类型

四、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色&#xff1a; 对机器而言&#xff0c;类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言&#xff0c;类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

vLLM推理服务库

一、定义 定义与目的为什么Cache只存储K、V&#xff0c;而不存储Q&#xff1f;为什么vllm和HF推理结果不一致&#xff1f;vLLM 实现原理pagedAttention 实现原理模型部署demo 二、实现 定义与目的 目的&#xff1a;减少显存、提高吞吐量。如何优化KV cache&#xff0c;节省显…

基于大模型训练的数字识别

创作原因 现在写电赛题&#xff0c;题目有识别数字的要求。但使用设备openmv使用模板匹配的算法帧率很低&#xff0c;且识别效果不是很好&#xff0c;于是我们就想到了利用神经网络训练模型来识别数字 正文部分 内容介绍 本文内容是基于openmv使用Edge Impulse训练大模型。…

爬虫工作量由小到大的思维转变---<第七十五章 > Scrapy爬虫回调函数在请求重试中的应用研究

前言&#xff1a; 在Scrapy框架中&#xff0c;利用回调函数进行请求重试的实践方法与其优劣势&#xff0c;与传统的中间件重试机制进行对比。通过深入分析回调函数的工作原理及其在网络爬虫项目中的应用&#xff0c;旨在提高网络爬虫的效率和稳健性。同时&#xff0c;本文将探讨…

服务攻防——应用协议ssh,rsync,proftpd,openssh,libssh

1.口令猜解 ftp-拿来文件传输的 rdp-windows远程连接 3389 ssh-linux远程连接 工具hydra 口令 1.windows 这就爆破成功了&#xff0c;现在&#xff0c;我们就可以ftp爆破&#xff0c;爆破出ftp的密码 爆破出来后 访问 2.ssh Rsync&#xff08;配置不当&#xff0c;未授权…

【Docker】docker-compose简单实战

1、首先要准备好Jar包 docker-compose.yml version: "2.2.4" services:redis:image: rediscontainer_name: redisvolumes:- /redis/data:/data- /redis/redis.conf://usr/local/etc/redis/redis.confnetworks:- kewu-networkkewu:build:context: .dockerfile: dock…

[NOI Online #2 入门组] 未了

[NOI Online #2 入门组] 未了 题目描述 由于触犯天神&#xff0c;Sisyphus 将要接受惩罚。 宙斯命 Sisyphus 推一块巨石上长度为 L L L 的山坡。Sisyphus 匀速向上推的速度为每年 v v v 的长度&#xff08;由于是匀速&#xff0c;故经过 1 2 \frac{1}{2} 21​ 年将能向上…

Gooxi发布最新AI服务器:加速生成式AI落地 更懂AI

近日&#xff0c;Gooxi发布最新训推一体AI服务器&#xff0c;以大容量内存和灵活的高速互连选项满足各种AI应用场景&#xff0c;最大可能支持扩展插槽&#xff0c;从而大幅提升智能算力性能&#xff0c;以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AI…

主从Reactor服务器

目录&#xff1a; 目录&#xff1a; 目标&#xff1a; 本文讲解思路&#xff1a; 各模块的功能以及代码&#xff1a; 1.服务器相关模块&#xff1a;服务器模块的功能是对所有的连接以及线程进⾏管理 2.协议相关模块&#xff1a;协议模块是对当前的Reactor模型服务器提供应…

【HarmonyOS】Stage 模型 - 应用配置文件

如图所示&#xff1a; Stage 模型应用配置文件主要有两类&#xff1a; 全局配置文件。放在 AppScope 目录下&#xff0c;app.json5。用来配置应用全局的信息。模块配置文件&#xff0c;放在每个模块里&#xff0c;module.json5。用来配置模块的信息。 一、全局配置文件 示…

python的取余与计算商的关系

在Python中&#xff0c;取余数使用的是 % 运算符。它计算一个数除以另一个数的余数&#xff0c;并将结果返回。 例如&#xff0c;如果你执行 a % b&#xff0c;它将返回 a 除以 b 的余数。 这在编程中有很多用途&#xff0c;其中一些包括&#xff1a; 判断奇偶性&#xff1a…

LeetCode1657确定两个字符串是否接近

题目描述 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。例如&#xff0c;abcde -> aecdb操作 2&#xff1a;将一个 现有 字符的每次出现转换为另一个 现有 字符&#xff0…

【数据可视化01】matplotlib实例3之数据统计

目录 一、引言二、实例介绍1.百分位数为横条形图2.箱线图定制化3.带有自定义填充颜色的箱线图4.箱线图5.箱线图和小提琴图6.二维数据集的置信椭圆 一、引言 matplotlib库 可以用来创建各种静态、动态、交互式的图形&#xff0c;并广泛应用于数据分析和数据可视化领域。 二、实…

通过Doxygen+Breathe+Sphinx生成代码文档

环境 CentOS Linux 7DoxygenBreathe, Sphinx (安装在同一python 环境下) ➜ build yum install doxygen # 安装最新版本的 Sphinx 及依赖。 # -U 将所有指定的软件包升级到最新的可用版本, 依赖项的处理取决于所使用的升级策略。 ➜ build pip3 install -U Sphinx ➜ buil…