[C++]一些list,stack和queue选择题和编程题

这时我们学完后的应用

一、选择题

1.下面有关vector和list的区别,描述错误的是( )

A.vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随机存取,应该使用vector

B.list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用list

C.vector<int>::iterator支持“+”、“+=”、“<”等操作符

D.list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[ ]运算符

这里我们之前见过了list不支持[]进行下标的随机访问

解析:

A.如果想大量随机读取数据操作,vector是首选的容器

B.如果想大量的插入和删除数据,list效率较高,是首选

C.由于vector底层是连续空间,其迭代器就是相应类型的指针,所以支持对应的操作

D.list迭代器不支持[]运算符

2.以下代码实现了从表中删除重复项的功能,请选择其中空白行应填入的正确代码( )

template<typename T>
void removeDuplicates(list<T> &aList)
{T curValue;list<T>::iterator cur, p;cur = aList.begin();while (cur != aList.end()){curValue = *cur;_____________//空白行while (p != aList.end()){if (*p == curValue){___________________ //空白行}else{p++;}}}
}A. p=cur+1;aList.erase(p++);
B.p=++cur; p == cur ? cur = p = aList.erase(p) : p = aList.erase(p);
C.p=cur+1;aList.erase(p);
D.p=++cur;aList.erase(p);

这题很简单吧,选择B

这题考到了我们之前说过的一个重点——迭代器失效

我们说过

当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效

iterator失效主要有两种情况:

1、iterator变量已经变成了“野指针”,对它进行*,++,--都会引起程序内存操作异常;

2、iterator所指向的变量已经不是你所以为的那个变量了。

解析:

迭代p需要迭代不重复节点的下一节点,重要的是cur迭代器需要往下迭代,因此cur需要往前移动,二答案A C的cur都不会改变,空白行2是当需要找到重复值时进行节点删除,当删除时当前迭代器会失效,因此需要将迭代器p往后迭代,所以答案为 B        

3.以下程序输出结果为( )

int main()
{int ar[] = { 0,1, 2, 3, 4,  5, 6, 7, 8, 9 };int n = sizeof(ar) / sizeof(int);list<int> mylist(ar, ar+n); list<int>::iterator pos = find(mylist.begin(), mylist.end(), 5);reverse(mylist.begin(), pos);reverse(pos, mylist.end());list<int>::const_reverse_iterator crit = mylist.crbegin();while(crit != mylist.crend()){cout<<*crit<<" ";++crit;}cout<<endl;
}

A.4 3 2 1 0 5 6 7 8 9

B.0 1 2 3 4 9 8 7 6 5

C.5 6 7 8 9 0 1 2 3 4

D.5 6 7 8 9 4 3 2 1 0

这题很简单,我们只需要理清楚对应的函数的应用即可

解析:list<int>::iterator pos = find(mylist.begin(), mylist.end(), 5); //找到5的位置

reverse(mylist.begin(), pos);//逆置0 1 2 3 4 为 4 3 2 1 0

reverse(pos, mylist.end()); //逆置5 6 7 8 9 为 9 8 7 6 5

逆置完成之后其数据为:4 3 2 1 0 9 8 7 6 5

list<int>::const_reverse_iterator crit = mylist.crbegin(); //反向迭代器进行反向访问

while(crit != mylist.crend()){}

所以答案为:5 6 7 8 9 0 1 2 3 4

C答案

4.下面程序的输出结果正确的是( )

int main(
{
int array[] = { 1, 2, 3, 4, 0, 5, 6, 7, 8, 9 };
int n = sizeof(array) / sizeof(int);
list<int> mylist(array, array+n);
auto it = mylist.begin();
while (it != mylist.end())
{
if(* it != 0)
cout<<* it<<" ";
else
it = mylist.erase(it);
++it;
}
return 0;
}

A.1 2 3 4 5 6 7 8 9

B. 1 2 3 4 6 7 8 9

C.程序运行崩溃

D.1 2 3 4 0 5 6 7 8  

这个就是对当前程序分析没什么好说的,选B

解析:程序在使用迭代器取值时,如果不等于0就进行打印,为0时不打印并删除当前节点,注意erase()函数删除后,迭代器it向后移动一位,指向下一个元素。所以答案为 B

5.对于list有迭代器it, 当erase(it)后,说法错误的是( )

A.当前迭代器it失效

B.it前面的迭代器仍然有效

C.it后面的迭代器失效

D.it后面的迭代器仍然有效

还是对于迭代器失效的概念的考察,选C

解析:删除节点后,只有指向当前节点的迭代器失效了,其前后的迭代器仍然有效,因为底层为不连续空间,只有被删除的   节点才会失效, 所以答案为 C

6.下面有关vector和list的区别,描述错误的是( )

A.vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随机读取,应该使用vector

B.list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用list

C.vector<int>::iterator支持“+”、“+=”、“<”等操作符

D.list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[]运算符

解析:

A.如果想大量随机读取数据操作,vector是首选的容器

B.如果想大量的插入和删除数据,list效率较高,是首选

C.由于vector底层是连续空间,其迭代器就是相应类型的指针,所以支持对应的操作

D.list迭代器不支持[]运算符

7.下面有关vector和list的区别,描述正确的是( )

A.两者在尾部插入的效率一样高

B.两者在头部插入的效率一样高

C.两者都提供了push_back和push_front方法

D.两者都提供了迭代器,且迭代器都支持随机访问

解析:

A.vector在尾部插入数据不需要移动数据,list为双向循环链表也很容易找到尾部,因此两者在尾部插入数据效率相同

B.vector头部插入效率极其低,需要移动大量数据

C.vector由于在头部插入数据效率很低,所以没有提供push_front方法

D.list不支持随机访问

8.下列代码的运行结果是( )

void main()
{stack<char> S;char x,y;x='n';y='g';S.push(x);S.push('i');S.push(y);S.pop();S.push('r');S.push('t');S.push(x);S.pop();S.push('s');while(!S.empty()){x = S.top();S.pop();cout<<x;};cout<<y;
}

A.gstrin

B.string

C.srting

D.stirng

解析:

S.push(x);S.push('i');S.push(y); 入栈了字母“nig”  左边栈底 右边栈顶S.pop();S.push('r');S.push('t');S.push(x); 字母g出栈,然后入栈字母“rtn”,此时栈数据为"nirtn"

S.pop();S.push('s');字母n出栈,s入栈,最终的栈数据为nirts

while(!S.empty()){} 栈不空出栈打印,按相反顺讯出栈,所以打印结果为:strin

cout<<y;最后还打印了字母g

所以答案为B

9.下列代码的运行结果是( )

void main()
{queue<char> Q;char x,y;x='n';y='g';Q.push(x);Q.push('i');Q.push(y);Q.pop();Q.push('r');Q.push('t');Q.push(x);Q.pop();Q.push('s');while(!Q.empty()){x = Q.front();Q.pop();cout<<x;};cout<<y;
}

A.gstrin

B.grtnsg

C.srting

D.stirng

解析:

Q.push(x);Q.push('i');Q.push(y); 入队数据为:nig 左边对头,右边队尾

   Q.pop();Q.push('r');Q.push('t');Q.push(x); n出队,rtn入队,队里数据为:igrtn

   Q.pop();Q.push('s'); i出队,s入队,队里数据为:grtns

   while(!Q.empty()){} 队不空,在出队打印为:grtns

   cout<<y; 最后在打印一个g

   故答案为:B

以下是一个二叉树的遍历算法,queue是FIFO队列,请参考下面的二叉树,根节点是root,正确的输出是( )

        1

     2      3

  4    5 6    7

queue.push(root);
while(!queue.empty())
{node = queue.top();queue.pop();                             output(node->value)    //输出节点对应数字if(node->left)queue.push(node->left);if(node->right)queue.push(node->right);   
}

A.1376254

B.1245367

C.1234567

D.1327654

这题很简单,此题是一个层次遍历的伪代码,能够看出是层次遍历,其结果就迎刃而解,答案 C

二、编程题

1.最小栈

本题主要是要理解理解栈结构先进后出的性质。

思路:

  • 我们只需要设计一个数据结构,使得每个元素 a 与其相应的最小值 m 时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。
  • 当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
  • 当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;
  • 在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。
class MinStack {stack<int> x_stack;stack<int> min_stack;
public:MinStack() {min_stack.push(INT_MAX);}void push(int x) {x_stack.push(x);min_stack.push(min(min_stack.top(), x));}void pop() {x_stack.pop();min_stack.pop();}int top() {return x_stack.top();}int getMin() {return min_stack.top();}
};

思路来源:力扣官方题解

2.栈的弹出压入序列

这题我们也是使用辅助栈

思路:

题目要我们判断两个序列是否符合入栈出栈的次序,我们就可以用一个栈来模拟。对于入栈序列,只要栈为空,序列肯定要依次入栈。那什么时候出来呢?自然是遇到一个元素等于当前的出栈序列的元素,那我们就放弃入栈,让它先出来。

class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {int n = pushV.size();//辅助栈stack<int> s;//遍历入栈的下标int j = 0;//遍历出栈的数组for(int i = 0; i < n; i++){//入栈:栈为空或者栈顶不等于出栈数组while(j < n && (s.empty() || s.top() != popV[i])){s.push(pushV[j]);j++;}//栈顶等于出栈数组if(s.top() == popV[i])s.pop();//不匹配序列elsereturn false;}return true;}
};

思路来源:牛客官方题解

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

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

相关文章

vue3-tree-org实现带照片的组织架构图

官方文档&#xff1a;vue3-tree-org 显示照片需要注意的地方 使用步骤 下载 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 实现代码 <tem…

1.MQ介绍

MQ 消息队列&#xff0c;本质是一个队列&#xff0c;先进先出&#xff0c;只不过队列中存放的内容是message而已。 为啥学习MQ 1.流量消峰 如果一个订单系统最多每秒能处理一万次订单&#xff0c;正常情况下我们下单1秒后就能返回结果。但是在高峰期&#xff0c;如果有两万…

mybatisPlus和mybatis的版本冲突问题、若依换成MP、解决git无法推送、使用若依框架的swagger、以后再遇到团队项目应该怎么做。

20240716 一. mybatisPlus和mybatis的版本冲突问题1. 使用前的准备2. 我遇到了一个很严重的问题。3. 解决问题&#xff0c;好吧也没解决&#xff0c;发现问题&#xff01;&#xff01; 二、该死的git&#xff01;&#xff01;&#xff01;&#xff01;1. 解决无法在idea中使用g…

【对顶堆 优先队列】2102. 序列顺序查询

本文涉及知识点 对顶堆 优先队列 LeetCode 2102. 序列顺序查询 一个观光景点由它的名字 name 和景点评分 score 组成&#xff0c;其中 name 是所有观光景点中 唯一 的字符串&#xff0c;score 是一个整数。景点按照最好到最坏排序。景点评分 越高 &#xff0c;这个景点越好。…

nginx负载均衡实例

实现效果 浏览器输入地址http://nginx服务器ip(:80)/edu/a.html&#xff0c;实现负债均衡效果&#xff0c;平均分配到 服务器ip:8080和 服务器ip:8081进程中。 准备工作 准备两个tomcat&#xff0c;一个监听在8080端口&#xff0c;一个监听在8081端口。也可以准备多个tomcat。…

FreeRTOS的中断管理、临界资源保护、任务调度

什么是中断&#xff1f; 简介&#xff1a;让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断。 中断优先级分组设置 ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级&#xff0c;这个寄存器就是中断优先级…

TS 入门(六):TypeScript泛型编程

目录 前言回顾接口与类1. 泛型函数2. 泛型接口3. 泛型类4. 泛型约束5. 多重类型参数与默认类型a. 多重类型参数b. 默认类型参数 结语 前言 在前三章中&#xff0c;我们介绍了 TypeScript 的基础知识、函数与对象类型。在本章中&#xff0c;我们将探讨更高级的类型和类型操作&a…

【STM32】按键控制LED光敏传感器控制蜂鸣器(江科大)

一、按键控制LED LED.c #include "stm32f10x.h" // Device header/*** 函 数&#xff1a;LED初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void LED_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENAB…

多级表头固定列问题

父级的width&#xff0c;是需要固定的列的width的总和 参考&#xff1a; el-table 多级表头下对应列的固定

springboot基于协同过滤算法的黔醉酒业白酒销售系统lw源码调试讲解

相关技术 2.1 Vue框架 目前市面上出现了许多优秀的前端框架可以解决了许多开发问题&#xff0c;Vue 就是这样一款优秀的框架&#xff0c;它与现代浏览器和支持ES2015的Node.js版本兼容&#xff0c;Vue.js的核心库只关注视图层&#xff0c;非常容易学习和集成到其他库或项目中[…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【23】【订单服务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【23】【订单服务】 订单中心订单信息用户信息订单基础信息商品信息优惠信息支付信息物流信息 订单状态订单流程订单创建与支付逆向流程 订单确认页Feign远程调用丢失请求头问题Feign异步…

基于springboot和mybatis的RealWorld后端项目实战一之hello-springboot

新建Maven项目 注意archetype选择quickstart pom.xml 修改App.java App.java同级目录新增controller包 HelloController.java package org.example.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotatio…

商业数据分析思维的培训PTT制作大纲分享

商业数据分析思维的培训PTT制作大纲: 基本步骤: 明确PPT的目的和主题 收集并整理相关内容资料 构思并确定PPT的框架大纲 编写PPT的内容文字 插入图片、图表等视觉元素 设计PPT的版式和模板 排练并修改PPT 输出并备份最终版本 目的:数据思维培养; 主题:商业数据分…

LLM微调

文章目录 一. 常见微调分类1.1 全量微调&#xff08;FFT&#xff1a;Full Fine-tuning&#xff09;1.2 参数高效微调(PEFT&#xff1a;Parameter-Efficient Fine-Tuning)1.3 指令微调&#xff08;IFT&#xff1a;Instructional Fine-tuning&#xff09;1.3.1 Hard prompt1.3.2 …

C++客户端Qt开发——常用控件QWidget

四、常用控件 属性 作用 enabled 设置控件是否可使用.true 表⽰可用&#xff0c;false 表示禁用 geometry 位置和尺寸&#xff0c;包含x,y,width,height四个部分 其中坐标是以⽗元素为参考进行设置的. windowTitle 设置widget标题 windowIcon 设置widget图标 windowO…

Window中 Redis下载安装

Redis7.2.3连接&#xff1a; 我用夸克网盘分享了「redis-windows-7.2.3.zip」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/4dfb0497707a 在安…

Java读写t5557卡源码

T5557卡是美国Atmel公司生产的多功能非接触式射频卡芯片&#xff0c;属于125KHz的低频卡&#xff0c;在国内有广大的应用市场。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操作模式的参数配置块。第0页第7块可以作用户数据块…

完善kset_uevent_ops结构体

1、struct kset_uevent_ops 2、实验 #include<linux/module.h> #include<linux/init.h>

win10删除鼠标右键选项-360工具

鼠标右键菜单时&#xff0c;发现里面的选项特别多&#xff0c;找一下属性&#xff0c;半天找不到。删除一些不常用的选项&#xff0c;让右键菜单变得干净整洁。 1、打开360安全卫士&#xff0c;点击功能大全&#xff0c;搜索"右键管理" 2、点击右键管理 3、找到对应的…

SpringCache介绍

SpringCache是Spring提供的缓存框架。提供了基于注解的缓存功能。 SpringCache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff08;只需要导入不同的Jar包即可&#xff09;&#xff0c;如EHCache&#xff0c;Caffeine&#xff0c;Redis。 2个重要依赖已经导入&a…