数据结构 第3章作业 栈和队列 西安石油大学

news2024/11/23 23:43:00

在这里插入图片描述

第3章 栈和队列

有5个元素,其入栈次序为:A,B,C,D,E,在各种可能的出栈次序中,以元素C、D最先出栈(即C第一个且D第二个出栈)的次序有哪几个?

3个:CDEBA;CDBEA;CDBAE 此题考查的知识点是栈的后进先出特点。 按题意,C先 出, 说明A、B已人栈,D出栈, 再出栈,E可以入栈就出 栈, 可以有序列C,D,E,B,A; 也可以B先出“E”再 人,再出, 得序列C,D,B,E,A;还可以B、A都出栈 后,E再入栈出栈, 得序列C,D,B,A,E。只有这三 种情况。

用栈实现将中缀表达式8-(3+5)*(5-6/2)转换成后缀表达式,画出栈的变化过程图。

根据中缀表达式转后缀表达式的算法,可以使用一个栈来辅助实现转换过程。下面是将中缀表达式转换为后缀表达式的步骤:

  1. 创建一个空栈和一个空列表(存储后缀表达式)。
  2. 从左到右遍历中缀表达式的每个字符:
    • 如果遇到操作数(数字),直接加入到后缀表达式列表中。
    • 如果遇到开括号’(',将其压入栈中。
    • 如果遇到操作符(+、-、*、/):
      • 当栈为空或栈顶元素是开括号’('时,直接将操作符压入栈中。
      • 否则,比较当前操作符与栈顶操作符的优先级:
        • 如果当前操作符的优先级高于栈顶操作符,将当前操作符压入栈中。
        • 否则,将栈顶操作符弹出并加入到后缀表达式列表中,直到栈为空或栈顶操作符优先级低于当前操作符,然后将当前操作符压入栈中。
    • 如果遇到闭括号’)':
      • 重复将栈顶操作符弹出并加入到后缀表达式列表中,直到栈顶元素是开括号’(‘。弹出并丢弃开括号’('。
  3. 遍历完中缀表达式后,将栈中剩余的操作符依次弹出并加入到后缀表达式列表中。
  4. 后缀表达式列表即为转换后的后缀表达式。

下面是栈的变化过程图:

中缀表达式:8-(3+5)*(5-6/2)

字符     栈     后缀表达式列表
8                8
-                8
(          (
3          (     8
+          (+    8
5          (+    8 3
)          +     8 3
*          *     8 3+
(          *(*   8 3+5
5          *(*   8 3+5
-          *(*   8 3+5 5
6          *(*   8 3+5 5
/          *(/   8 3+5 5 6
2          *(/   8 3+5 5 6 2
)          *     8 3+5 5 6 2/-
           *-    8 3+5 5 6 2/-
           -     8 3+5 5 6 2/-*     

因此,将中缀表达式8-(3+5)*(5-6/2)转换成后缀表达式为:8 3 5 + 5 6 2 / - * -。

5.在顺序循环队列中,可以设置一个标志域tag,以tag=0和tag=1来区分当尾指针(rear)头指针(front)相等时队列状态是空还是满。试编写此结构相应的队列初始化,入队 出队算法。

顺序循环队列中,可以设置一个标志域tag,表示队列的状态。当rear指向队列尾部时,如果tag为1,则表示队列满;如果tag为0,则表示队列未满但是rear指向了队列尾的下一个位置;当rear指向front时,如果tag为1,则表示队列已满;如果tag为0,则表示队列为空。

以下是相应的代码实现:

#define MAXSIZE 100
typedef int ElemType;

typedef struct {
    ElemType data[MAXSIZE];
    int front;
    int rear;
    int tag;
} SqQueue;

// 初始化队列
void InitQueue(SqQueue& Q) {
    Q.front = Q.rear = 0;
    Q.tag = 0;  // 初始时队列为空
}

// 判断队列是否为空
bool QueueEmpty(SqQueue Q) {
    return (Q.front == Q.rear) && (Q.tag == 0);
}

// 判断队列是否已满
bool QueueFull(SqQueue Q) {
    return (Q.front == Q.rear) && (Q.tag == 1);
}

// 入队操作
bool EnQueue(SqQueue& Q, ElemType x) {
    if (QueueFull(Q)) {
        return false;
    }
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear + 1) % MAXSIZE;
    Q.tag = 1;  // 标记队列已满
    return true;
}

// 出队操作
bool DeQueue(SqQueue& Q, ElemType& x) {
    if (QueueEmpty(Q)) {
        return false;
    }
    x = Q.data[Q.front];
    Q.front = (Q.front + 1) % MAXSIZE;
    Q.tag = 0;  // 标记队列未满
    return true;
}

需要注意的是,因为环形队列的长度是有限的,因此在初始化、入队、出队等操作时都需要对下标进行取模运算,以防止数组越界。

这段代码是关于顺序队列(循环队列)的定义和操作实现。

首先定义了一个常量MAXSIZE表示队列的最大长度,以及一个元素类型ElemType和一个结构体SqQueue。其中,SqQueue包含一个大小为MAXSIZE的ElemType数组data、一个表示队头下标的front、一个表示队尾下标的rear和一个标识队列是否已满的tag。

接着定义了几个操作函数:InitQueue、QueueEmpty、QueueFull、EnQueue和DeQueue。

InitQueue函数用来初始化队列,将队头和队尾下标都置为0,并将tag标识为0表示队列为空。

QueueEmpty函数用来判断队列是否为空,当队头和队尾下标相同时且tag为0时,表示队列为空,返回true,否则返回false。

QueueFull函数用来判断队列是否已满,当队头和队尾下标相同时且tag为1时,表示队列已满,返回true,否则返回false。

EnQueue函数用来进行入队操作,如果队列已满,则无法入队,返回false,否则将元素x赋值给队尾,将队尾下标加1并取模,更新tag为1表示队列已满,返回true表示入队成功。

DeQueue函数用来进行出队操作,如果队列为空,则无法出队,返回false,否则将队头元素赋值给x,将队头下标加1并取模,更新tag为0表示队列未满,返回true表示出队成功。

1.选择题
(1)若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在( )种情况。
A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5
D.2,3,5,4,1
答案:C
解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。
(2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为( )。
A.i B.n-i C.n-i+1 D.不确定
答案:C
解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。
(3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为( )。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n
答案:D
解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。
(4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作( )。
A.x=top->data;top=top->link; B.top=top->link;x=top->link;
C.x=top;top=top->link; D.x=top->link;
答案:A
解释:x=top->data将结点的值保存到x中,top=top->link栈顶指针指向栈顶下一结点,即摘除栈顶结点。
(5)设有一个递归算法如下
int fact(int n) { //n大于等于0
if(n<=0) return 1;
else return n*fact(n-1); }
则计算fact(n)需要调用该函数的次数为( )。
A. n+1 B. n-1 C. n D. n+2
答案:A
解释:特殊值法。设n=0,易知仅调用一次fact(n)函数,故选A。
(6)栈在 ( )中有所应用。
A.递归调用 B.函数调用 C.表达式求值 D.前三个选项都有
答案:D
解释:递归调用、函数调用、表达式求值均用到了栈的后进先出性质。
(7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是( )。
A.队列 B.栈 C. 线性表 D.有序表
答案:A
解释:解决缓冲区问题应利用一种先进先出的线性表,而队列正是一种先进先出的线性表。
(8)设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是( )。
A.2 B.3 C.4 D. 6
答案:B
解释:元素出队的序列是e2、e4、e3、e6、e5和e1,可知元素入队的序列是e2、e4、e3、e6、e5和e1,即元素出栈的序列也是e2、e4、e3、e6、e5和e1,而元素e1、e2、e3、e4、e5和e6依次进入栈,易知栈S中最多同时存在3个元素,故栈S的容量至少为3。
(9)若一个栈以向量V[1…n]存储,初始栈顶指针top设为n+1,则元素x进栈的正确操作是( )。
A.top++; V[top]=x; B.V[top]=x; top++;
C.top–; V[top]=x; D.V[top]=x; top–;
答案:C
解释:初始栈顶指针top为n+1,说明元素从数组向量的高端地址进栈,又因为元素存储在向量空间V[1…n]中,所以进栈时top指针先下移变为n,之后将元素x存储在V[n]。
(10)设计一个判别表达式中左,右括号是否配对出现的算法,采用( )数据结构最佳。
A.线性表的顺序存储结构 B.队列
C. 线性表的链式存储结构 D. 栈
答案:D
解释:利用栈的后进先出原则。
(11)用链接方式存储的队列,在进行删除运算时( )。
A. 仅修改头指针 B. 仅修改尾指针
C. 头、尾指针都要修改 D. 头、尾指针可能都要修改
答案:D
解释:一般情况下只修改头指针,但是,当删除的是队列中最后一个元素时,队尾指针也丢失了,因此需对队尾指针重新赋值。
(12)循环队列存储在数组A[0…m]中,则入队时的操作为( )。
A. rear=rear+1 B. rear=(rear+1)%(m-1)
C. rear=(rear+1)%m D. rear=(rear+1)%(m+1)
答案:D
解释:数组A[0…m]中共含有m+1个元素,故在求模运算时应除以m+1。
(13)最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是( )。
A. (rear+1)%nfront B. rearfront
C.rear+1front D. (rear-l)%nfront
答案:B
解释:最大容量为n的循环队列,队满条件是(rear+1)%nfront,队空条件是rearfront。
(14)栈和队列的共同点是( )。
A. 都是先进先出 B. 都是先进后出
C. 只允许在端点处插入和删除元素 D. 没有共同点
答案:C
解释:栈只允许在栈顶处进行插入和删除元素,队列只允许在队尾插入元素和在队头删除元素。
(15)一个递归算法必须包括( )。
A. 递归部分 B. 终止条件和递归部分
C. 迭代部分 D. 终止条件和迭代部分
答案:B

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

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

相关文章

用ChatGPT做数据分析,提升10倍工作效率

目录 写报告分析框架报告框架指标体系设计 Excel 写报告 分析框架 拿到一个专题不知道怎么做&#xff1f;没关系&#xff0c;用ChatGPT列一下框架。 以上分析框架挺像那么回事&#xff0c;如果没思路的话&#xff0c;问问ChatGPT能起到找灵感的作用。 报告框架 报告的框架…

Django开发之进阶篇

Django进阶篇 一、Django学习之模板二、Django学习之中间件默认中间件自定义中间件 三、Django学习之ORM定义模型类生成数据库表操作数据库添加查询修改删除 一、Django学习之模板 在 Django 中&#xff0c;模板&#xff08;Template&#xff09;是用于生成动态 HTML&#xff…

Jmeter常用断言之断言持续时间简介

Duration Assertion&#xff1a;断言持续时间。 断言持续时间通常用于做性能测试&#xff0c;一般用于检查HTTP请求的响应时间是否超过预期值。而这个响应时间是性能测试中常关注的一个性能指标。 一、添加断言方式 根据需要可在【测试计划】、【线程组】、【线程请求】下添加…

VMware Horizon 8 运维系列(三)win10设置共享桌面图标

前言 在win10模板上用管理员帐号安装好软件之后&#xff0c;有的软件快捷图标不会出现在桌面上&#xff0c;有的即使有在桌面上出现&#xff0c;但是当发布云桌面池后&#xff0c;客户端登录的都是不同的域用户&#xff0c;当不同的用户登录系统的时候&#xff0c;很多软件快捷…

端粒/端粒酶生信切入点,6+端粒酶+泛癌+甲基化+实验。

今天给同学们分享一篇端粒酶泛癌甲基化实验的生信文章“Genomic, epigenomic, and transcriptomic signatures for telomerase complex components: a pan‐cancer analysis”&#xff0c;这篇文章于2022年10月31日发表在Mol Oncol期刊上&#xff0c;影响因子为6.6。 激活端粒酶…

提高战斗力+分享游戏干货,带你解锁无敌吃鸡技巧!

大家好&#xff01;作为吃鸡行家&#xff0c;我今天要和大家聊一些热门话题&#xff0c;包括如何提高战斗力和分享游戏干货&#xff0c;以及吃鸡作图、装备查询等技巧。 首先&#xff0c;让我们来谈谈提高战斗力。在绝地求生&#xff08;PUBG&#xff09;等吃鸡游戏中&#xff…

Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))

星光下的赶路人star的个人主页 这世上唯一扛得住岁月摧残的就是才华 文章目录 1、状态管理1.1 Flink中的状态1.1.1 概述1.1.2 状态的分类 1.2 按键分区状态&#xff08;Keyed State&#xff09;1.2.1 值状态&#xff08;ValueState&#xff09;1.2.2 列表状态&#xff08;ListS…

H5逆向之远程RPC

引言前一讲说过H5 怎么去抓包,逆向分析。其中说到RPC。这一节详细讲一下。有一种情况,JS 比较复杂,混淆的厉害。 这个时候就用到RPC。原理就是,hook web 浏览器,直接调用js 里边的方法。 Node 服务。为什么用到Node 服务,先来看下这架构 Node 对外提供各种接口,外部可以…

【算法分析与设计】回溯法(下)

目录 一、符号三角形问题二、N皇后问题三、0-1背包问题四、最大团问题4.1 进一步改进 五、图的m着色问题5.1 算法设计六、旅行售货员问题七、连续邮资问题八、回溯法效率分析九、重排原理十、回溯法的效率分析十一、Monte Carlo方法附一、四后问题的搜索树附二、随机选择路径附…

竞赛选题 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

iTunes更新iOS17出现发生未知错误4000的原因和解决方案

有不少人使用iTunes更新iOS 17时出现「无法更新iPhone发生未知的错误4000」的错误提示&#xff0c;不仅不知道iTunes升级失败的原因&#xff0c;也无从解决iPhone无法更新4000的问题。 小编今天就分享iPhone更新iOS系统出现4000错误提示的原因和对应的解决方案。 为什么iPhone…

桥梁安全在线监测预警系统解决方案

在我们的日常生活中&#xff0c;桥梁作为重要的交通枢纽&#xff0c;其安全性与稳定性至关重要。然而&#xff0c;桥梁由于其所处的特殊环境以及复杂的施工过程&#xff0c;往往容易受到各种因素的影响。最近频繁发生的桥梁施工事故引起了人们的广泛关注。这些事故的原因可能各…

机器视觉工程师,我们上班的意义在哪里?

很多朋友&#xff0c;现在不是自己想做的工作&#xff0c;那你做这份工作干什么&#xff1f;担心自己没有竞争力&#xff0c;担心自己被替代。上班的意义是完成自己头脑和资源的原始积累&#xff0c;迈向下一级人生游戏;我最终要靠自己本事吃饭&#xff0c;而不是一直待在这个只…

【yaml文件的编写】

yaml文件编写 YAML语法格式写一个yaml文件demo创建资源对象查看创建的pod资源创建service服务对外提供访问并测试创建资源对象查看创建的service在浏览器输入 nodeIP:nodePort 即可访问 详解k8s中的port&#xff1a;portnodePorttargetPortcontainerPortkubectl run --dry-runc…

【b站韩顺平 快速学Java课】(超详细)安装完JDK后的环境变量配置教程 总结

安装JDK8&#xff08;包括JRE8&#xff09;教程笔记看这个&#xff1a;http://t.csdnimg.cn/QVPXf 1.为什么要配置环境变量&#xff1a; 拿我之前安装完JDK8但是还没配置环境变量的时候的情况举例&#xff1a; &#xff08;1&#xff09;winR输入cmd打开控制台 &#xff08;…

windows2003远程访问tscc.msc[终端服务配置\连接]选项卡为灰色,怎么样才能使其可配置

&#xff08;计算机配置\管理模板\windows 组件\终端服务\会话&#xff09;设置一下。 全部改成未被配置就对了 gpedit.msc

Eastern Exhibition【中位数 距离和的最小值】

Eastern Exhibition【中位数 距离和的最小值】 题意翻译 二维平面上有 n 个点&#xff0c;要找一个点&#xff0c;使得所有点到它的曼哈顿距离&#xff08; x 和 y 的坐标差距之和&#xff09;之和最小。请问有几个满足该要求的点&#xff1f; 输入输出样例 输入 #1 6 3 0 0 2 …

吃鸡必备神器!提升战斗力,分享顶级游戏干货!

绝地求生已经成为了一款风靡全球的游戏&#xff0c;为了帮助各位吃鸡爱好者提升战斗力&#xff0c;闪电般获得胜利&#xff0c;我们特地整理了一些神器和干货&#xff0c;与大家分享。 首先&#xff0c;为了方便大家进行吃鸡作图&#xff0c;我们推荐了几款绝地求生作图工具。这…

【轻松玩转MacOS】数据备份篇

引言 为什么要备份数据&#xff1f; 想象一下&#xff0c;你正在享受MacOS带来的便捷与高效&#xff0c;突然电脑崩溃了&#xff0c;或者你的硬盘坏了。这个时候&#xff0c;你可能会痛不欲生&#xff0c;因为你的所有数据都在里面。这就是为什么我们需要定期备份数据的原因。记…

NPM 常用命令(十)

目录 1、npm prefix 1.1 使用语法 1.2 描述 1.3 示例 2、npm prune 2.1 使用语法 2.1 描述 3、npm publish 3.1 使用语法 3.2 描述 包中包含的文件 4、npm query 4.1 使用语法 4.2 描述 4.3 示例 5、npm rebuild 5.1 使用语法 5.2 描述 6、npm repo 6.1 使…