Cpp/Qtday030908cpp基础

news2024/11/24 4:40:09

目录

目录

自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量

成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小

头文件:stack.h

源文件:  stack.cpp

测试文件:main.cpp

效果图

自行封装一个循环顺序队列的类,包含私有成员属性:存放队列的数组、队头位置、队尾位置

成员函数完成:构造函数、析构函数、拷贝构造函数、入队、出队、清空队列、判空、判满、求队列大小

头文件:queue.h

源文件:  queue.cpp

测试文件:main.cpp

效果图

思维导图


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

using namespace std;

class Stack
{
private:
    int data[128];
    int top;
public:
    Stack();
    ~Stack();
    Stack(Stack &s);
    //判空
    bool stack_empty();
    //返回布尔类型,真为空,假为非空
    //判满
    bool stack_full();
    //返回布尔类型,真为满,假为非满
    //入栈
    int stack_in(int num);
    //出栈
    int stack_out();
    //清空栈
    bool stack_clear();
    //获取栈顶元素
    int stack_get_top();
    //求栈的大小
    int stack_size();
    //为了便于观察现象,加一个展示栈内元素的函数,从栈顶向栈底
    void stack_show();
};

#endif // STACK_H
源文件:  stack.cpp
#include "stack.h"

Stack::Stack():top(-1){
    cout<<"Stack:构造函数"<<endl;
}

Stack::~Stack(){
    cout<<"Stack:析构函数"<<endl;
}

Stack::Stack(Stack &s):top(s.top){
    for(int i=0; i<=top; i++){
        data[i] = s.data[i];
    }
    cout<<"Stack:拷贝构造函数"<<endl;
}
//判空
bool Stack::stack_empty(){
    //top正好记录栈顶元素的下标,所以当top为-1时,栈空
    return -1 == top;
}
//判满
bool Stack::stack_full(){
    //top正好记录栈顶元素的下标,所以当top为127时,栈满
    return 127 == top;
}
//入栈
int Stack::stack_in(int num){
    //如果栈满,则拒绝入栈
    if(Stack::stack_full()){
        cout<<"栈已满"<<endl;
        return -1;
    }
    //将栈顶变量的值+1,就能指向新的栈顶
    top++;
    //将要入栈的数据放入数组中
    data[top] = num;
    return 0;
}
//出栈
int Stack::stack_out(){
    //判断栈是否为空,为空则无法出栈
    if(Stack::stack_empty()){
        cout<<"栈已空"<<endl;
        return -1;
    }
    //按照我的定义,top正好记录了栈顶元素的下标,因此top--,会将top自减,并且top--这个表达式
    //的值为top,所以可以输出data[top]也就是栈顶元素的值,同时top自减一次,而要出栈,出的
    //就是栈顶元素
    return data[top--];
}
//清空栈
bool Stack::stack_clear(){
    //如果栈本身为空则无需清空
    if(Stack::stack_empty()){
        cout<<"栈已空"<<endl;
        return false;
    }
    //如果栈非空则需要清空

    //将栈顶指针置为-1即可
    top = -1;
    return true;
}
//获取栈顶元素
int Stack::stack_get_top(){
    //首先栈要非空
    if(Stack::stack_empty()){
        cout<<"栈已空"<<endl;
        return -1;
    }
    //原理与出栈相同,唯一的区别就是无需将栈顶变量移动
    return data[top];
}
//求栈的大小
int Stack::stack_size(){
    //已知,top变量记录了栈顶元素的下标,所以要求栈中的元素数量,只需将top+1就可得到
    return top+1;
}
//为了便于观察现象,加一个展示栈内元素的函数,从栈顶向栈底
void Stack::stack_show(){
    //首先栈要非空
    if(Stack::stack_empty()){
        cout<<"栈为空"<<endl;
        return ;
    }
    for(int i=top; i>-1; i--){
        cout << data[i] << "  ";
    }
    cout<<endl;
}
测试文件:main.cpp
#include <iostream>
#include "stack.h"

using namespace std;

int main()
{
    Stack s1;
    //入栈
    s1.stack_in(4);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    s1.stack_in(3);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    s1.stack_in(9);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    s1.stack_in(6);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    s1.stack_in(1);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    s1.stack_in(5);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    s1.stack_in(5);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    s1.stack_in(7);
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    //拷贝构造函数的使用
    Stack s2(s1);
    //展示栈内元素
    cout<<"s2:";
    s2.stack_show();
    //出栈
    cout<<s1.stack_out()<<"出栈成功"<<endl;
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    cout<<s1.stack_out()<<"出栈成功"<<endl;
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    cout<<s1.stack_out()<<"出栈成功"<<endl;
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    //获取栈的大小
    cout<<"此时栈内元素的数量为:"<<s1.stack_size()<<endl;
    //栈顶元素为
    cout<<"栈顶元素为:"<<s1.stack_get_top()<<endl;
    //清空栈
    s1.stack_clear();
    cout<<"栈清空成功"<<endl;
    //展示栈内元素
    cout<<"s1:";
    s1.stack_show();
    return 0;
}
效果图

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

#include <iostream>

using namespace std;

class Queue
{
private:
    int data[12];
    int head;
    int tail;

public:
    //构造函数
    Queue();
    //析构函数
    ~Queue();
    //拷贝构造函数
    Queue(Queue &q);
    //判空
    bool queue_empty();
    //判满
    bool queue_full();
    //入队
    int queue_in(int num);
    //出队
    int queue_out();
    //清空队列
    bool queue_clear();
    //求队列大小
    int queue_size();
    //为了便于观察现象,加一个展示队列元素的函数,从队头到队尾
    void queue_show();
};

#endif // QUEUE_H
源文件:  queue.cpp
#include "queue.h"

//构造函数
Queue::Queue():head(0),tail(0){
    cout<<"Queue:构造函数"<<endl;
}

//析构函数
Queue::~Queue(){
    cout<<"Queue:析构函数"<<endl;
}

//拷贝构造函数
Queue::Queue(Queue &q):head(q.head),tail(q.tail){
    int h = head;
    while(h!=tail){
        data[h] = q.data[h];
        h = (h+1)%12;
    }
    cout<<"Queue:拷贝构造函数"<<endl;
}

//判空
bool Queue::queue_empty(){
    //当队列的头变量与尾变量的值相同时,队列为空
    return head == tail;
}

//判满
bool Queue::queue_full(){
    //队尾变量记录的下标中是不保存变量的,以便操作与计数
    //因此,当队尾变量的值比对头变量的值小1或者-11的时候,队满
    return (tail+1)%12 == head;
}

//入队
int Queue::queue_in(int num){
    //要能入队,首先队列不能为满
    if(Queue::queue_full()){
        cout<<"队列已满,无法入队"<<endl;
        return -1;
    }

    //此时可以入队
    data[tail] = num;

    //队尾变量自增一次
    tail = (tail + 1)%12;

    return 0;
}

//出队
int Queue::queue_out(){
    //要能出队,首先队列不能为空
    if(Queue::queue_empty()){
        cout<<"队列已空,无法入队"<<endl;
        return -1;
    }
    //此时可以出队
    int tmp = data[head];
    //对头变量自增一次
    head = (head + 1)%12;

    return tmp;
}

//清空队列
bool Queue::queue_clear(){
    //若队列为空则无需清空
    if(Queue::queue_empty()){
        cout<<"队列已空,无需清空"<<endl;
        return false;
    }
    //操作队头队尾变量,使满足队列为空的条件
    head = tail;

    return true;
}

//求队列大小
int Queue::queue_size(){
    //根据队首队尾的位置即可求出队列大小
    return (tail + 12 - head)%12;
}

//为了便于观察现象,加一个展示队列元素的函数,从队头到队尾
void Queue::queue_show(){
    //若队列为空则提示队列为空
    if(Queue::queue_empty()){
        cout<<"队列为空"<<endl;
        return;
    }
    int h = head;
    while(h!=tail){
        cout<<data[h]<<"  ";
        h = (h+1)%12;
    }
    cout<<endl;
    return;
}
测试文件:main.cpp
#include <iostream>
#include "queue.h"
using namespace std;

int main()
{
    Queue q1;
    //入队
    q1.queue_in(4);
    //展示
    cout<<"q1: ";
    q1.queue_show();
    //入队
    q1.queue_in(3);
    //展示
    cout<<"q1: ";
    q1.queue_show();
    //入队
    q1.queue_in(9);
    //展示
    cout<<"q1: ";
    q1.queue_show();
    //入队
    q1.queue_in(6);
    //展示
    cout<<"q1: ";
    q1.queue_show();
    //入队
    q1.queue_in(1);
    //展示
    cout<<"q1: ";
    q1.queue_show();
    //入队
    q1.queue_in(5);
    //展示
    cout<<"q1: ";
    q1.queue_show();
    //入队
    q1.queue_in(5);
    //展示
    cout<<"q1: ";
    q1.queue_show();
    //入队
    q1.queue_in(7);
    //展示
    cout<<"q1: ";
    q1.queue_show();

    //拷贝构造函数
    Queue q2(q1);
    //展示
    cout<<"q2: ";
    q2.queue_show();

    //出队
    cout<<q1.queue_out()<<"出队成功"<<endl;
    //出队
    cout<<q1.queue_out()<<"出队成功"<<endl;
    //出队
    cout<<q1.queue_out()<<"出队成功"<<endl;
    //展示
    cout<<"q1: ";
    q1.queue_show();

    //求队列大小
    cout<<"q1队列大小为"<<q1.queue_size()<<endl;

    //清空队列
    q1.queue_clear();
    cout<<"队列清空成功"<<endl;

    //展示
    cout<<"q1: ";
    q1.queue_show();

    //求队列大小
    cout<<"q1队列大小为"<<q1.queue_size()<<endl;


    return 0;
}
效果图

思维导图

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

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

相关文章

数据结构之队列的实现(附源码)

目录 一、队列的概念及结构 二、队列的实现 拓展&#xff1a;循环队列 三、初学的队列以及栈和队列结合的练习题 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(Fi…

jmeter 线程组 Open Model Thread Group 阶梯式压测、高峰流量压测

简介 Open Model Thread Group 是5.4.1 版本中引入的一个实验性线程组&#xff0c;可以弹性模拟负载测试。例如设置多个线程模式&#xff0c;再根据这些线程模式调整不同的并发数、暂停时间。由于Open Model Thread Group 是一个实验性线程组&#xff0c;可能会存在一些限制和不…

英语单词(1)

1.void:空的 2.main:主要的 3.class:类 4.system:系统 5.out: 输出 6.print:打印 7.public:公共的,公用的 8.static:静态的,静止的 9.oracle:甲骨文公司 10.eclipse: java编程语言

javascritp如何判断是从刷新(重新加载)、正常打开(或链接打开)、还是从浏览器回退进入页面的

重点先下另外一个知识点&#xff1a; 当我们的Web站点采用主体页面的iframe导航各个子页面&#xff08;浏览器地址保持不变&#xff09;的情况&#xff0c;如果我们希望每次iframe中打开的新的子页面&#xff0c;也都能够像在不采用iframe的情况那样&#xff0c;后续能够在浏览…

leetcode:58. 最后一个单词的长度

题目&#xff1a; 函数原型&#xff1a; int lengthOfLastWord(char * s) 解析&#xff1a; 求最后一个单词的长度&#xff0c;我们有两种思路 第一种思路&#xff1a; 逆向求&#xff0c;先设置一个字符串下标index&#xff0c;定位到最后一个单词的最后一个字符。再一个设置长…

【web开发】4.JavaScript与jQuery

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、JavaScript与jQuery二、JavaScript常用的基本功能1.插入位置2.注释3.变量4.数组5.滚动字符 三、jQuery常用的基本功能1.引入jQuery2.寻找标签3.val、text、appe…

CSP-J初赛复习大题整理笔记

本篇全是整理&#xff0c;为比赛准备. 在这里插入代码片 #include<cstdio> using namespace std; int n, m; int a[100], b[100];int main() {scanf_s("%d%d", &n, &m);for (int i 1; i < n; i)a[i] b[i] 0;//将两个数组清0&#xff0c;这…

Django Form实现表单使用及应用场景

首先需要定义一个使用场景&#xff1a; 音乐网站的前端部分可以添加上传歌手的单曲&#xff0c; 这个添加页面就使用django form表单来实现。 目录 数据表内容 歌手表及表模型 单曲表及表模型 演示表单使用 设置路由 创建form.py 视图实例化表单类 模板使用表单对象 表…

个人用户怎么免费使用电子签章平台,制作能在手机上双方都可以签字的租房合同?

环境 苹果11Pro手机 微信小程序 腾讯电子签 PDF版租房合同 问题描述 最近租房要续签合同&#xff0c;房东在外地&#xff0c;怎么免费使用有规范的合同电子签约平台制作电子签章&#xff0c;双方都能在手机上签合同&#xff0c;完成线上签约 解决方案 1.首先打开微信在搜…

【面试经典150 | 双指针】验证回文串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;筛选判断方法二&#xff1a;原地判断 知识回顾回文串双指针字符串操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分…

【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)

目录 一&#xff0c;二叉树的顺序结构实现 1&#xff0c;二叉树的顺序结构 2&#xff0c;堆的概念及结构 3&#xff0c;堆的接口实现 1&#xff0c;堆的创建 2&#xff0c;接口函数 3&#xff0c;初始化 4&#xff0c;销毁 5&#xff0c;是否增容 6&#xff0c;交换数据…

Redis基础详解

目录 一、概述 redis作用 redis特性 二、Redis基础知识 为什么Redis是单线程的&#xff1f; Redis的高并发和快速原因&#xff1f; Redis6.0 之后为何引入了多线程&#xff1f; 三、Redis五大数据类型&#xff0c;三种特殊数据类型 启动Redis Redis-Key String&#…

UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes

文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…

【web开发】5.Mysql及python代码执行数据库操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、MYSQL二、MySQL管理查看已有数据库创建数据库删除数据库进入数据库创建表删除表展示表的行列插入数据查看表中的数据删除数据修改数据 三、python代码执行数据库…

【数据结构与算法系列5】螺旋矩阵II (C++ Python)

给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a;n 1 输出&am…

4.3.3.1 【MySQL】CHAR(M)列的存储格式

我们知道 Compact 行格式在 CHAR(M) 类型的列中存储数据的时候还挺麻烦&#xff0c;分变长字符集和定长字符集的情况&#xff0c;而在 Redundant 行格式中十分干脆&#xff0c;不管该列使用的字符集是啥&#xff0c;只要是使用 CHAR(M) 类型&#xff0c;占用的真实数据空间就是…

2023年财务顾问行业研究报告

第一章 行业概况 1.1 定义及分类 财务顾问&#xff08;Financial Advisor&#xff0c;FA&#xff09;也被称为融资顾问&#xff0c;主要为创业公司提供投资和融资的专业服务。他们在创业者和投资者之间扮演着至关重要的中介角色&#xff0c;为双方搭建桥梁&#xff0c;确保投…

Python - 队列【queue】task_done()和join()基本使用

一. 前言 task_done()是Python中queue模块提供的方法&#xff0c;用于通知队列管理器&#xff0c;已经处理完了队列中的一个项目。 queue.task_done()是Queue对象的一个方法&#xff0c;它用于通知Queue对象&#xff0c;队列中的某一项已经被处理完毕。通常在使用Queue对象时…

【数据结构】 树和二叉树概念

1.树概念及结构 树概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;…

Android lint配置及使用

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、将 lint 配置为不显示警告3.1 在 A…