【C++】day3学习成果:类

news2024/11/25 10:29:02

1.自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量
成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小
头文件stack.h:

#ifndef STACK_H
#define STACK_H

#include <iostream>

using namespace std;

#define MAX 8

class Stack
{
private:
    int *data;      //栈的数组,指向堆区空间,用于存储栈的容器
    int top;        //记录栈顶的变量
public:
    //无参构造函数
    Stack();
    //有参构造函数
    Stack(int data);
    //析构函数
    ~Stack();
    //拷贝构造函数
    Stack(const Stack &other);
    //入栈
    bool stack_push(int e);
    //出栈
    bool stack_pop();
    //清空栈
    void stack_free();
    //判空
    bool stack_empty();
    //判满
    bool stack_full();
    //获取栈顶元素
    int stack_top();
    //求栈的大小
    int stack_size();
};



#endif // STACK_H

源文件stack.cpp:

#include"stack.h"
#include<iostream>

无参构造函数
//Stack::Stack(){}
有参构造函数
//Stack::Stack(int data){}
析构函数
//Stack::~Stack(){}
拷贝构造函数
//Stack::Stack(const Stack &other){}
//无参构造函数
Stack::Stack():top(-1),data(new int[MAX]){
    cout<<"Stack::无参构造函数:初始化栈成功"<<endl;
}
有参构造函数
//Stack::Stack(int data){
//    cout<<"Stack::有参构造函数"<<endl;
//    top=data;
//}
//析构函数
Stack::~Stack(){
    cout<<"Stack::析构函数"<<endl;
    delete []data;
    data=nullptr;
}
//拷贝构造函数
Stack::Stack(const Stack &other):data(other.data),top(other.top){
    cout<<"Stack::拷贝构造函数"<<endl;
}

//入栈
bool Stack::stack_push(int e)
{
    if(top<-1)
    {
        cout<<"所给栈不合法"<<endl;
        return false;
    }else if(stack_full())
    {
        cout<<"入栈失败,栈满"<<endl;
        return false;
    }
    //先加后压
    top++;
    this->data[top]=e;
    cout<<data[top]<<"入栈成功"<<endl;
    return true;
}

//出栈
bool Stack::stack_pop()
{
    if(top<-1)
    {
        cout<<"所给栈不合法"<<endl;
        return false;
    }
    //出栈逻辑:先弹后减
    cout<<data[top]<<"出栈成功"<<endl;
    top--;
    return true;
}

//清空栈
void Stack::stack_free()
{
    if(top<-1)
    {
        cout<<"所给栈不合法"<<endl;
        return;
    }
    for(top;top>-1;top--)
    {
        stack_pop();
    }

    top=-1;

    cout<<"清空成功"<<endl;
}

//判空
bool Stack::stack_empty()
{
    if(top==-1)
    {
        return true;
    }else
    {
        if(top<-1)
        {
            cout<<"所给栈不合法"<<endl;
        }
        return false;
    }
}

//判满
bool Stack::stack_full()
{
    if(top<-1)
    {
        cout<<"所给栈不合法"<<endl;
        return false;
    }else if(top==MAX-1)
    {
        return true;
    }else
    {
        return false;
    }

}

//获取栈顶元素
int Stack::stack_top()
{
    if(top<-1||stack_empty())
    {
        cout<<"获取失败"<<endl;
        return NULL;
    }

    return data[top];
}

//求栈的大小
int Stack::stack_size()
{
    if(!stack_empty())
    {
        return top+1;
    }
    cout<<"所给链表不合法"<<endl;
    return -1;
}

主函数main.cpp:

#include "stack.h"

int main()
{
    Stack s;
    //入栈
    for(int i=MAX;i>=0;i--)
    {
        s.stack_push(i);
    }
    if(s.stack_full())
    {
        cout<<"栈满"<<endl;
    }
    //出栈
    for(int i=0;i<MAX;i++)
    {
        s.stack_pop();
    }
    s.stack_push(1);
    s.stack_push(2);
    s.stack_push(3);
    s.stack_push(11);
    s.stack_push(12);
    s.stack_push(111);
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;
    s.stack_pop();
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;
    s.stack_free();
    if(s.stack_empty())
    {
        cout<<"栈空"<<endl;
    }
    s.stack_push(1);
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;
    s.stack_push(2);
    s.stack_push(3);
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;

    Stack s2;
    s2.stack_push(3);
    s2.stack_push(2);
    s2.stack_push(1);
    s=s2;
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;
    cout<<"&s2="<<&s2<<",&s="<<&s<<endl;

    return 0;
}

运行结果:
运行结果1

2.自行封装一个循环顺序队列的类,包含私有成员属性:存放队列的数组、队头位置、队尾位置
成员函数完成:构造函数、析构函数、拷贝构造函数、入队、出队、清空队列、判空、判满、求队列大小

头文件linkqueue.h:

#ifndef LINKQUEUE_H
#define LINKQUEUE_H

#include <iostream>

using namespace std;

#define MAX 8

class ListQueue
{
private:
    int *data;      //存放队列的数组,初始化时向堆区申请数组空间
    int front;      //队头位置,记录对头所在的元素下标
    int tail;      //队尾位置,记录最后一个元素的下一个下标的位置
public:
    //无参构造函数
    ListQueue();
    //有参构造函数
    ListQueue(int data);
    //析构函数
    ~ListQueue();
    //拷贝构造函数
    ListQueue(const ListQueue &other);
    //入队
    bool ListQueue_push(int e);
    //出队
    bool ListQueue_pop();
    //清空队
    void ListQueue_free();
    //判空
    bool ListQueue_empty();
    //判满
    bool ListQueue_full();
    //求队列的大小
    int ListQueue_size();
};

#endif // LINKQUEUE_H

源文件linkQueue.cpp:

#include "linkQueue.h"

//无参构造函数
ListQueue::ListQueue():
    data(new int[MAX]),front(0),tail(0)
{
    cout<<"Stack::无参构造函数:初始化循环队列成功"<<endl;
}
//有参构造函数
//ListQueue::ListQueue(int data){}

//析构函数
ListQueue::~ListQueue()
{
    cout<<"Stack::析构函数"<<endl;
    delete []data;
    data=nullptr;
}

//拷贝构造函数
ListQueue::ListQueue(const ListQueue &other):
    data(other.data),front(other.front),tail(other.tail)
{
     cout<<"Stack::拷贝构造函数"<<endl;
}

//入队
bool ListQueue::ListQueue_push(int e)
{
    if(ListQueue_full())
    {
        cout<<"入队失败\n"<<endl;
        return false;
    }
    //将数据放在队尾所在地方
    data[tail]=e;
    cout<<"data["<<tail<<"]="<<e<<" 入队成功"<<endl;
    //队尾后移
    tail=(tail+1)%MAX;
    return true;
}

//出队
bool ListQueue::ListQueue_pop()
{
    if(ListQueue_empty())
    {
        cout<<"出队失败\n"<<endl;
        return false;
    }
    cout<<"data["<<front<<"]="<<data[front]<<" 出队成功"<<endl;
    //队头后移
    front=(front+1)%MAX;
    return true;
}
//清空队
void ListQueue::ListQueue_free()
{
    for(int i=front;i<tail;i++)
    {
        data[i]=NULL;
    }
    front=tail=0;
    cout<<"清空队列成功"<<endl;
}

//判空
bool ListQueue::ListQueue_empty()
{
    if(front==tail)
    {
        return true;
    }else
    {
        return false;
    }
}

//判满
bool ListQueue::ListQueue_full()
{
    if((tail+MAX)%MAX==front && !ListQueue_empty())
    {
        return true;
    }else
    {
        return false;
    }
}
//求队列的大小
int ListQueue::ListQueue_size()
{
    return (tail+MAX-front)%MAX;
}

主函数main.c:

#include "linkQueue.h"

int main()
{
    ListQueue queue;

    queue.ListQueue_push(1);
    queue.ListQueue_push(2);
    queue.ListQueue_push(3);
    queue.ListQueue_push(8);
    queue.ListQueue_push(9);
    queue.ListQueue_push(10);
    queue.ListQueue_push(11);
    queue.ListQueue_push(12);
    queue.ListQueue_push(13);
    queue.ListQueue_pop();
    queue.ListQueue_push(1);

    queue.ListQueue_free();
    queue.ListQueue_push(10);
    queue.ListQueue_push(11);
    queue.ListQueue_push(12);
    cout<<"size of queue="<<queue.ListQueue_size()<<endl;

    cout<<"*************************"<<endl;
    ListQueue queue2;
    queue2.ListQueue_push(1);
    queue2=ListQueue(queue);
    cout<<"size of queue2="<<queue2.ListQueue_size()<<endl;


    return 0;
}

运行结果:
运行结果2

3.思维导图
C++day3

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

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

相关文章

计算机专业毕业设计项目推荐01-生产管理系统(JavaSpringBoot+原生Js+Mysql)

生产管理系统&#xff08;JavaSpringBoot原生JsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以…

LLM 位置编码及外推

RoPE https://zhuanlan.zhihu.com/p/629681325 PI 位置插值&#xff08;POSITION INTERPOLATION&#xff09;显著改善RoPE的外推能力。你只需要对PT&#xff08;pretraining)模型fine-turing最多1000步就能实现。PI是通过将线性的缩小了输入位置的索引使其匹配原始上下文窗口…

【Java 基础篇】Java ArrayList 指南:无所不能的数据伴侣

Java 是一门流行的编程语言&#xff0c;拥有丰富的集合类库&#xff0c;其中之一是 ArrayList。ArrayList 是 Java 集合框架中的一个重要类&#xff0c;它允许我们以动态数组的方式存储和操作数据。无论你是初学者还是有一定经验的开发者&#xff0c;本篇博客都将为你详细介绍 …

怎样吃透一个java项目?

前言 对于刚开始看视频敲代码&#xff0c;最忌讳的便是一上来就完全照着视频做&#xff0c;这么做就算完完全全的跟着视频做出来一个项目&#xff0c;始终都无法将里面具体的知识化为己有&#xff0c;单纯来说只是简单的复刻&#xff0c;视频的作者本身是不会对他在做该项目过…

TouchGFX之自定义触发条件和操作

通过TouchGFX Designer&#xff0c;您可以自己定义具有触发条件和操作的交互组件。 自定义容器创建自定义触发条件&#xff1a;通过自定义容器的属性选项卡添加自定义触发条件 使用交互系统发送自定义触发条件&#xff1a; 通过自定义容器的“交互”选项卡&#xff0c;创建新的…

【工具使用】Dependency Walker使用

一&#xff0c;简介 在工作过程中常常会遇到编译的dll库运行不正常的情况&#xff0c;那就需要确认dll库是否编译正常&#xff0c;即是否将函数编译到dll中去。今天介绍一种查看dll库中函数定义的工具——Dependency walker。 二&#xff0c;软件介绍 Dependency Walker是一…

centos7安装kubernets集群

一、准备工作 准备三台虚拟机&#xff0c;centos7系统 二、系统配置 1. 修改主机名 # 三台机器都需要执行 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node22. 修改hosts文件 # 三台机器都需要执行 [rootk8s-…

微信小程序开发教学系列(2)- 抖音小程序开发基础

2.1 抖音小程序的基本组成部分 抖音小程序的目录结构非常简单&#xff0c;主要包含以下几个核心文件和文件夹&#xff1a; app.json 文件&#xff1a;用于配置小程序的全局配置&#xff0c;包括窗口样式、页面路径、网络请求设置等等。pages 文件夹&#xff1a;用于存放所有的…

智慧工地:实现作业区域安全管控

智慧工地是围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效。 建设工程安全文明施工与质量提升,全方位的监测施工人员、各类器械设备、消防安全隐患&#xff0c;并提前对风险进行预警…

高校网络安全体系建设及零信任安全架构应用的探索

网络安全是高校信息化建设的重中之重&#xff0c;它同时也随着高校信息化的快速发展而不断面临新的挑战。因此&#xff0c;要用发展的眼光去看待网络安全&#xff0c;体系化推进网络安全体系建设。山东师范大学校园信息化经过10多年的建设发展&#xff0c;在网络安全上探索出了…

博客系统(升级(Spring))(一)创建数据库,创建实例化对象,统一数据格式,统一报错信息

博客系统&#xff08;一&#xff09; 博客系统创建项目 建立数据库结构链接服务器和数据库和Redis 创建实例化对象统一数据结构结构 统一报错信息 博客系统 博客系统是干什么的&#xff1f; CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统&#xff0c;这…

SAP中的新旧事务码

SAP中的新旧事务码 SAP随着新版本的发布&#xff0c;我们知道sap已经更新了很多的程序和TCODE。sap提供了很多新的TCODE来替换旧的TCODE&#xff0c;新TCODE有很多的新特性和新功能。在这个这种情况下&#xff0c;很多旧TCODE就会被废弃。我们如何查找这个替换呢&#xff1f; …

如何使用OpenGL画出ROS rviz那样的点云可视化效果

【请尊重原创&#xff01;转载和引用文章内容务必注明出处&#xff01;未经许可上传到某文库或其他收费阅读/下载网站赚钱的必追究责任&#xff01;】 ROS rviz可以将点云以多种形式渲染出来比较漂亮&#xff0c;尤其是根据intensity渲染点云不同的色彩和亮度的功能比较好&…

List集合详解

目录 1、集合是什么&#xff1f; 1.1、集合与集合之间的关系 2、List集合的特点 3、遍历集合的三种方式 3.1、foreach(增强佛如循环遍历) 3.2、for循环遍历 3.3、迭代器遍历 4、LinkedList和ArrayList的区别 4.1、为什么ArrayList查询会快一些&#xff1f; 4.2、为什么LinkedLi…

2023大数据挑战赛全国六强团队获奖经验+ppt分享(五)

团队名称 会魔法的老人 团队成员 刘克林&#xff08;重庆邮电大学&#xff09; 敖宇&#xff08;重庆邮电大学&#xff09; 杨敏&#xff08;重庆邮电大学&#xff09; 团队名次 全国第二名 赛题描述说明介绍 2023大数据挑战赛赛题说明决赛评分标准回顾 参赛分享与收获 本次大赛…

x86体系结构(WinDbg学习笔记)

寄存器 eaxAccumulator累加器ebxBase register基寄存器ecxCounter register计数器寄存器edxData register - can be used for I/O port access and arithmetic functions数据寄存器-可用于I/O端口访问和算术函数esiSource index register源索引寄存器ediDestination index reg…

第50节:cesium 绘制指定类型区域(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><el-button-group class="top_item"><el-button type=

fatedier/frp内网穿透详细安装及使用教程

《参考地址》 fatedier/frp是一款开源的主要使用Go语言开发的内网穿透工具。主要分为服务端&#xff08;frps&#xff09;和客户端&#xff08;frpc&#xff09;。 简单理解&#xff1a;服务端&#xff08;frps&#xff09;就是部署到公网ip服务器提供给客户端&#xff08;frpc…

MySQL中的字符集和排序规则

关键字: 字符集&#xff0c;utf8mb4&#xff0c;emoj 众所周知&#xff0c;mysql的utf8是假的utf8&#xff0c;没法存emoj等字符。要设置为utf8mb4... 问题 同事给了一段Update语句&#xff0c;更新某张表idxxx的某个字段; CREATE TABLE table_name ( id int(11) NOT NULL AUT…

OLED透明屏厚度:引领未来显示技术的革命

OLED透明屏作为一种未来显示技术&#xff0c;其薄度在整个行业中具有重要意义。 在这篇文章中&#xff0c;尼伽将详细介绍OLED透明屏厚度的优势、技术挑战以及应用案例&#xff0c;旨在为读者全面了解OLED透明屏的发展前景。 一、OLED透明屏厚度的优势 OLED透明屏采用柔性基板…