力扣 用栈实现队列-232

用栈实现队列-232

class MyQueue {
private:stack<int> instk,outstk;//定义两个栈类型的私有成员变量,instk用于接收入队的元素,outstk用于模仿出队操作
public:MyQueue() {//默认的构造函数用来初始化instk,outstk        }void push(int x) {//该函数用于模拟入栈,向队列中添加一个元素。接受一个整数x压入栈instk中instk.push(x);}int pop() {/*这个函数的作用是模拟出栈,将instk中的元素全部转移到outstk中,然后取出outstk中的栈顶元素存到整形变量x中,而后弹出栈中。*/if(outstk.empty()){while(!instk.empty()){outstk.push(instk.top());instk.pop();}}int x = outstk.top();outstk.pop();return x;} int peek() {//这个函数用于查看队列的队头元素,但并不将其从队列中移除。if(outstk.empty()){while(!instk.empty()){outstk.push(instk.top());instk.pop();}}return outstk.top();}bool empty() {/*这个函数用于检查队列是否为空。只有当instk和outstk都为空时,队列才被认为是空的,此时返回true否则返回false。*/return instk.empty()&&outstk.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

每日问题

解释一下拷贝构造函数和赋值运算符重载的作用

1.拷贝构造函数

作用

对象初始化:拷贝构造函数用于创建一个新对象,这个新对象的另一个已有对象的副本。当我们用一个已存在的对象来初始化一个新对象时,拷贝构造函数就会被调用。例如,在以下情况中会使用拷贝构造函数:

class MyClass{
public:MyClass(int value):data(value){}MyClass(const MyClass& other):data(other.data){}
private:int data;
};
int main()
{MyClass obj1(10);MyClass obj2 = obj1;//会调用拷贝构造函数return 0;
}

在这个例子中,当执行obj2 = obj1执行时,拷贝构造函数被调用,它会将obj1的数据成员data的值复制给obj2的数据成员data,从而创建一个和obj1完全一样的obj2对象。

参数传递:在函数调用过程中,当参数是按值传递对象时,也会调用拷贝构造函数。

void function(MyClass param){//函数体
}
int main(){MyClass obj(20);function(obj);//这里会调用拷贝构造函数,创建param对象return 0;
}

当function(obj)被调用时,会创建一个新的MyClass对象param,它是obj的副本,这个副本的创建过程就会调用拷贝构造函数。

函数返回值:当函数返回一个对象时,如果返回值时按值返回,那么在返回过程中也会调用拷贝构造函数。

MyClaSS function(){MyClass temp(30);return temp;
}
int main(){MyClass result = function();//这里会调用拷贝构造函数return 0;
}

在function函数返回temp对象时,会调用拷贝构造函数来创建一个临时对象,这个临时对象会被用来初始化result对象。

2.赋值运算符重载

作用:

对象赋值:赋值运算符重载用于将一个对象的值赋给另一个已存在的对象。它和拷贝构造函数的区别在于,赋值运算符是对一个已经存在的对象进行重新赋值,而拷贝构造函数是创建一个新的对象作为副本

class MyClass{
public:MyClass(int value):data(value){}MyClass& operator = (const MyClass& other){if(this!=&other){data = other.data;        }return *this;}
private:int data;
};
int main(){MyClass obj1(10);MyClass obj1(20);obj2 = obj1;//调用赋值运算符重载return 0;
}

在这个例子中,MyClass& operator=(const MyClass& other)是赋值运算符重载函数。当obj2 = obj1执行时,它会将obj1的数据成员data的值赋给obj2的数据成员data,使得obj2的值和obj1相同。

自定义赋值行为:通过重载赋值运算符,我们可以定义对象之间赋值的具体操作方式,特别是当对象包含动态分配的内存、指针或其他需要特殊处理的资源时。例如,如果类中哦有一个指针成员指向动态分配的内存,在赋值时需要先释放原有的内存,再重新分配并复制新的内存内容,这就需要通过赋值运算符重载来实现正确的内存管理。

什么是c++模板,有哪些类型的模板

1.函数模板

定义和作用

函数模板是一种通用的函数定义,可以用于生成多个功能相似但参数类型不同的函数。它允许程序员编写一个函数模板,然后根据实际使用时传入的参数类型,由编译器自动生成具体的函数版本。这样可以避免为每种可能参数类型吧编写重复的函数代码。例如,有一个函数模板用于交换两个变量的值:

template <typename T>
void swap(T& a, T& b) {T temp = a;a = b;b = temp;
}

这里的template 是函数模板的定义部分,T是一个模板参数,它可以代表任意类型。在函数体中,使用T来定义变量和参数,就好像T是一个实际的类型一样。当在程序中调用swap函数,如swap(x, y)(x和y是int类型变量)或swap(m, n)(m和n是double类型变量)时,编译器会根据指定的类型(int或double等)生成对应的函数版本,实现相应类型变量的交换。

特点

  • 类型参数化:函数模板的关键特点是类型参数化,即函数的参数类型和返回值类型(如果有返回值)可以根据实际调用时的需求由模板参数来确定。这使得代码更加灵活和通用。
  • 代码复用:通过使用函数模板,可以大大减少代码的重复编写。例如,对于不同类型的数组排序函数,如果不使用模板,可能需要为int数组、double数组、char数组等分别编写排序函数。而使用函数模板,只需要编写一个通用的排序函数模板,就可以适用于各种类型的数组(只要该类型支持比较操作等排序所需的操作)。

2.类模板

定义和作用:

类模板是用于创建通用类的模板。它允许程序员定义一个类的模板,其中某些成员(如数据成员、成员函数等)的类型可以根据实际使用时的需求进行参数化。例如,定义一个简单的栈(Stack)类模板

template <typename T>
class Stack {
private:T* elements;int size;int capacity;
public:Stack(int initialCapacity = 10);~Stack();void push(T element);T pop();bool isEmpty();
};

这里的template 表明这是一个类模板,T是模板参数。Stack类中的数据成员elements是一个指向T类型的指针,这意味着elements所指向的元素类型可以根据T的实际类型而变化。成员函数如push和pop的参数和返回值类型也与T相关,这样就可以创建不同类型的栈,如Stack(存储整数的栈)、Stack(存储双精度浮点数的栈)等。

特点

  • 类型灵活定制:类模板提供了一种灵活的方式来创建具有不同类型成员的类。可以根据具体的应用场景,通过指定不同的模板参数类型来创建具有不同功能和数据存储类型的类实例。
  • 代码通用性和复用性:与函数模板类似,类模板也提高了代码的通用性和复用性。例如,在一个大型项目中,可能需要使用多种类型的容器类(如队列、链表等),通过使用类模板,可以编写一个通用的容器类模板,然后根据实际需求生成不同类型的容器类,而不是为每种类型的容器编写单独的类定义。

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

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

相关文章

【一步步开发AI运动小程序】二十一、如果将AI运动项目配置持久化到后端?

**说明&#xff1a;**本文所涉及的AI运动识别、计时、计数能力&#xff0c;都是基于云智「Ai运动识别引擎」实现。云智「Ai运动识别」插件识别引擎&#xff0c;可以为您的小程序或Uni APP赋于原生、本地、广覆盖、高性能的人体识别、姿态识别、10余种常见的运动计时、计数识别及…

Python栈--深度优先搜索(迷宫问题)

给一个二维列表&#xff0c;表示迷宫(0表示给出算法&#xff0c;求通道&#xff0c;1表示围墙)。 给出算法&#xff0c;求一条走出迷宫的路径。 maze [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 0, 0, 0, 1, 0, 1], [1, 0, 0, 1, 0, 0, 0, 1, 0, 1], […

安卓主板_基于联发科MTK MT8788平台平板电脑方案_安卓核心板开发板定制

联发科MT8788安卓核心板平台介绍&#xff1a; MTK8788设备具有集成的蓝牙、fm、wlan和gps模块&#xff0c;是一个高度集成的基带平台&#xff0c;包括调制解调器和应用处理子系统&#xff0c;启用LTE/LTE-A和C2K智能设备应用程序。该芯片集成了工作在2.0GHz的ARM Cortex-A73、最…

LabVIEW 版本控制

在软件开发中&#xff0c;版本控制系统&#xff08;VCS&#xff09; 是管理代码版本变化的核心工具。对于 LabVIEW 用户&#xff0c;虽然图形化编程带来高效开发体验&#xff0c;但由于其特有的二进制 VI 文件格式&#xff0c;传统文本比较工具无法直接用于 LabVIEW 项目。这时…

centos7.9部署oracle19c教程

1.安装前准备 1.1关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalldvi /etc/selinux/config1.2 安装依赖 yum install -y unzip compat-libcap1 compat-libstdc-33 gcc-c ksh libaio-devel libstdc-devel elfutils-libelf-devel fontconfig-devel …

034集——JIG效果实现(橡皮筋效果)(CAD—C#二次开发入门)

可实现效果如下&#xff08;对象捕捉F3需打开&#xff0c;否则效果不好&#xff09;&#xff1a; public class CircleJig : EntityJig{public static void DraCJig(){PromptPointResult ppr Z.ed.GetPoint("a");if (ppr.Value null) return;Point3d pt ppr.Value…

Softing工业将在纽伦堡SPS 2024上展示Ethernet-APL现场交换机

今年&#xff0c;Softing工业将在纽伦堡SPS贸易展览会上展示aplSwitch Field —— 一款先进的过程自动化解决方案。这款16端口以太网高级物理层&#xff08;APL&#xff09;现场交换机的防护等级高达IP30&#xff0c;可提供从应用到现场级别的无缝以太网连接&#xff0c;专为Ex…

鸿蒙UI开发——小图标的使用

1、前 言 鸿蒙SDK中为我们提供了大量的高质量内置图标&#xff0c;图标详见(https://developer.huawei.com/consumer/cn/design/harmonyos-symbol/) 图标资源一览&#xff1a; 除了基本的图标图形外&#xff0c;我们还可以支持图标的多种填充模式&#xff08;单色、多色、分层…

python3的基本数据类型:Dictionary(字典)的创建

一. 简介 本文开始简单学习一下 python3中的一种基本数据类型&#xff1a;Dictionary&#xff08;字典&#xff09;。 字典&#xff08;dictionary&#xff09;是Python中另一个非常有用的内置数据类型。 二. python3的基本数据类型&#xff1a;Dictionary&#xff08;字典&…

2024 年使用 Postman 调用 WebService 接口图文教程

使用 Postman 调用 WebService 接口图文教程

设计字符串类 运算符重载 C++实现 QT环境

问题&#xff1a;设计字符串类&#xff0c; 支持下面的操作 MyString s1; // 默认构造函数 MyString s2("hello"); // 含参构造函数 MyString s3(s1); // 传参构造函数 MyString s4(5, c); // 自定义构造函数 // 运算符重载 ! > < // 运算符重…

链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)

判断循环双链表是否对称 设计一个算法用于判断带头节点的循环双链表是否对称 算法思想 让left从左向右扫描&#xff0c;right从右向左扫描&#xff0c;直到它们指向同一个节点&#xff1a;left right 或相邻left->next right&#xff0c;或right->prev left&#x…

基于STM32的智能声控分类垃圾桶(论文+源码)

1系统的功能及方案设计 本次课题为基于STM32的智能声控分类垃圾桶&#xff0c;其系统整体架构如图2.1所示&#xff0c;整个系统包括了stm32f103单片机主控制器&#xff0c;LU-ASR01语音识别模块&#xff0c;WT588语音播报模块&#xff0c;舵机等器件&#xff0c;用户可以通过语…

华大单片机跑历程IO口被写保护怎么解决

一&#xff0c;说明 使用的单片机是HC32F460KETA华大单片机&#xff0c;使用的代码历程是小华单片机历程&#xff0c;具体历程在小华官网都可以找到。   在使用小华历程跑模拟IIC时&#xff0c;SCL时钟是有的&#xff0c;但是IO输入被LOCK了&#xff0c;所以在跑历程进行断点…

网络与通信实验一 网络协议分析

Wireshark的安装 https://www.wireshark.org/&#xff08;下载链接&#xff09; 具体安装步骤参考 安装步骤 点击即可自动跳转 安装后打开 输入ipconfig 选择ipv4网卡存在的设备&#xff08;我的电脑选择WiFi&#xff09; 过滤条件选择 icmp cmd下输入 ping www.baidu.com…

电脑网络丢包怎么排查优化

上网已经成为必不可少的一部分,无论是看视频、玩游戏还是办公,网络的稳定性直接影响到我们的体验。然而有时候会遇到一些问题,比如网页加载慢、视频卡顿、游戏掉线等。这些问题的背后,往往是因为网络丢包。 网络丢包检测工具分享 什么是网络丢包? 网络丢包,简单来说,就是…

从0开始学习Linux——进程管理

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…

QT6.5+qt-quick+qml+cmake的Item布局学习

Item 是一个基础元素&#xff0c;它本身不会渲染任何东西&#xff0c;也不会提供一个窗口来显示其内容。Window 是一个可以显示内容的顶级元素&#xff0c;它通常会包含一个或多个子元素来构建用户界面。Item是全部QML可视化对象的根&#xff0c;所有可视化类型都由该类型派生出…

Cameralink转MIPI,Cameralink视频识别分析

CameraLink视频输入转MIPI极简方案&#xff0c;可直接输入到处理芯片中进行视频目标识别与跟踪

【算法】【优选算法】二分查找算法(下)

目录 一、852.⼭脉数组的峰顶索引1.1 二分查找1.2 暴力枚举 二、162.寻找峰值2.1 二分查找2.2 暴力枚举 三、153.寻找旋转排序数组中的最⼩值3.1 二分查找3.2 暴力枚举 四、LCR 173.点名4.1 二分查找4.2 哈希表4.3 暴力枚举4.4 位运算4.5 数学&#xff08;求和&#xff09; 一、…