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

这篇具有很好参考价值的文章主要介绍了【C++】day3学习成果:类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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;
}

运行结果:
【C++】day3学习成果:类,c++,学习,算法

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;
}

运行结果:
【C++】day3学习成果:类,c++,学习,算法

3.思维导图
【C++】day3学习成果:类,c++,学习,算法文章来源地址https://www.toymoban.com/news/detail-708845.html

到了这里,关于【C++】day3学习成果:类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端学习——ajax (Day3)

    使用 XMLHttpRequest XMLHttpRequest - 查询参数 XMLHttpRequest - 数据提交 Promise - 三种状态

    2024年02月16日
    浏览(42)
  • python系统学习Day3

    python函数的参数共有五种类型 参数定义的顺序必须是:必选参数, 默认参数, 可变参数, 命名参数, 参数 理解起来有两种分类方式:普通参照位置的参数/、 / 参数, 固定个数的参数 / 可变参数。 位置参照在前,固定个数在前。 部分类型可指定默认值

    2024年02月19日
    浏览(41)
  • 前端学习——JS进阶 (Day3)

    面向过程编程 面向对象编程 (oop) 练习 constructor 属性 对象原型 原型继承 原型链

    2024年02月16日
    浏览(33)
  • 【剑指offer】学习计划day3

      目录 一. 前言  二.替换空格         a.题目          b.题解分析           c.AC代码 三. 左旋转字符串          a.题目         b.题解分析         c.AC代码   本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下链接: 剑指offer-学习计划htt

    2024年02月13日
    浏览(95)
  • 学习笔记Day3:数据框、矩阵和列表

    要经常检查代码生成的结果,警惕不报错的错误 向量:一维 表格:二维 列表:三维 判断数据结构:class()或is族函数判断,或根据其生成的函数来判断 二维,每列只允许一种数据类型 数据框来源 用代码新建 由已有数据转换或处理得到 读取表格文件 R语言内置数据(iris,

    2024年03月11日
    浏览(78)
  • 黑马头条项目学习--Day3: 自媒体文章发布

    自媒体后台搭建 ①:资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下,并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 ②:资料中找到heima-leadnews-wemedia-gateway.zip解压 拷贝到heima-leadnews-gateway工程下,并指定子模块 添加对应的nacos配置 图片上传的

    2024年02月13日
    浏览(58)
  • 【Node.js学习 day3——http模块】

    命令行 ctrl + c 停止服务 当服务启动后,更新代码必须 重启服务才能生效 响应内容中文乱码的解决办法 端口号被占用 关闭当前正在运行监听端口的服务(使用较多) 修改其他端口号 HTTP协议默认端口是80。HTTP服务开发常用端口有3000,8080,8090,9000等。 想要获取请求的数据,需

    2024年02月02日
    浏览(52)
  • Verilog数据类型/常量/变量[学习笔记day3]

    1 数据类型 数据类型是用来表示数字电路中的 数据存储 和 传递单元 。 Verilog HDL中共有19种数据类型,其中 最基本的有4种 : 常:integer型 parameter型 变:reg型 wire型 其他:large, medium, scalared, small, time, tri, tri0, tri1, triand, trior, trireg, vectored, wand, wor等。 2 常量 在程序运行过程中

    2024年02月05日
    浏览(42)
  • Vue学习Day3——生命周期\组件化

    Vue生命周期:就是一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改数据,更新视图 4.销毁阶段:销毁Vue实例 Vue生命周期过程中,会 自动运行一些函数 ,被称

    2024年02月15日
    浏览(45)
  • 【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门

    目录 一、Ajax 1、简介 2、Axios (没懂 暂留) (1)请求方式别名 (2)发送get请求 (3)发送post请求 (4)案例 二、前端工程化 1、Vue项目-目录结构 2、Vue项目-启动 (1)vscode页面启动 (2)cmd命令框启动 3、配置Vue端口号 4、Vue项目开发流程 三、Vue组件库 - Element  1、快速入门

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包