C++:继承和多态,自定义封装栈,队列

news2024/12/23 18:41:17

1.栈:

stack.cpp

#include "stack.h"

Stack::Stack():top(nullptr),len(0){}
//析构函数
Stack::~Stack()
{
    while(!empty())
    {
        pop();
    }
}

bool Stack::empty() //判断栈是否为空
{
    return top==nullptr;
}

int Stack::size()//获取栈的大小
{
    return len;
}
//压栈操作
void Stack::push(int element)
{
    StackNode *newnode=new StackNode(element);//申请空间并初始化
    newnode->next=top;
    top=newnode;
    len++;
}
//出栈操作
int Stack::pop()
{
    if(empty())
    {
        throw out_of_range("空栈");
    }
    StackNode *temp=top;
    int value=top->data;
    top=top->next;
    delete temp;
    len--;
    return value;
}
//查看栈顶元素
int Stack::look_top()
{
    if(empty())
    {
        throw out_of_range("空栈");
    }
    return top->data;
}
//清空栈
void Stack::clear()
{
    while (!empty())
    {
        pop();
    }
}
Stack& Stack::operator=(const Stack& other)
{
    if (this != &other)
    {
        clear(); // 清空当前栈
        // 复制元素
        StackNode *current = other.top;
        while (current != nullptr)
        {
            push(current->data);
            current = current->next;
        }
    }
    return *this;
}

void Stack::swap(Stack& other)
{
       StackNode* tempTop = top;
       top = other.top;
       other.top = tempTop;

       int templen = len;
       len = other.len;
       other.len = templen;
   }

stack.h

#ifndef STACK_H
#define STACK_H
#include <iostream>
#include <stdexcept>

using namespace std;
//栈节点
class StackNode
{
public:
    int data;//存储数据
    StackNode *next;//指向下一个节点

    //构造函数
    StackNode(int d):data(d),next(nullptr){}

};

class Stack
{
private:
    StackNode *top;//指向栈顶
    int len;//栈中元素数量

public:
    Stack();
    //析构函数
    ~Stack();
    bool empty(); //判断栈是否为空
    int size();//获取栈的大小
   //压栈操作
    void push(int element);
    //出栈操作
    int pop();
    //查看栈顶元素
    int look_top();
    //
    void clear();
    Stack& operator=(const Stack& other) ;

    void swap(Stack& other);
};
#endif // STACK_H

2.队列

queue.cpp

#include "queue.h"

// 构造函数
Queue::Queue() : front(nullptr), rear(nullptr), count(0) 
{
    
}

Queue::~Queue() 
{
    clear();
}
void Queue::clear()
{
    while (front != nullptr)
    {
        QueueNode* temp = front;
        front = front->next;
        delete temp;
    }
    rear = nullptr;
    count = 0;
}

// 查看队列前端元素
int Queue::frontElement()
{
    if (empty())
    {
        throw std::out_of_range("空队列");
    }
    return front->data;
}
// 查看队列尾部元素
int Queue::backElement()
{
    if (empty())
    {
        throw std::out_of_range("空队列");
    }
    return rear->data;
}
//判断队列是否为空
bool Queue::empty()
{
    return front == nullptr;
}
// 获取队列的大小
int Queue::size() 
{
    return count;
}

// 入队操作
void Queue::push(int element)
{
    QueueNode* newNode = new QueueNode(element);
    if (rear == nullptr)  // 队列为空
    {
        front = rear = newNode;
    } else 
    {
        rear->next = newNode;
        rear = newNode;
    }
    count++;
}

// 出队操作
int Queue::pop() 
{
    if (empty()) {
        throw std::out_of_range("空队列");
    }
    QueueNode* temp = front;
    int dequeuedValue = front->data;
    front = front->next;
    if (front == nullptr) {
        rear = nullptr;
    }
    delete temp;
    count--;
    return dequeuedValue;
}

void Queue::swap(Queue& other) {
    using std::swap;
    swap(front, other.front);
    swap(rear, other.rear);
    swap(count, other.count);
}

queue.h

#ifndef QUEUE_H
#define QUEUE_H

#include <iostream>

using namespace std;

class QueueNode
{
public:
    int data;
    QueueNode *next;
    
    //有参构造
    QueueNode(int d):data(d),next(nullptr){}
};
class Queue {
private:
    QueueNode* front; // 指向队列头部的指针
    QueueNode* rear;  // 指向队列尾部的指针
    int count;        // 队列中元素的数量
    
public:
    // 构造函数
    Queue(); 
    // 析构函数
    ~Queue(); 
    //清空队列
    void clear(); 
    //判断队列是否为空
    bool empty();
    // 获取队列的大小
    int size(); 
    
    // 入队操作
    void push(int element);
    
    
    // 出队操作
    int pop();
    
    // 查看队列前端元素
    int frontElement();
    
    // 查看队列尾部元素
    int backElement();
   
    // 交换两个队列的内容
    void swap(Queue& other); 



};
#endif // QUEUE_H

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

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

相关文章

万字长文详解Java线程知识

什么是进程、线程、协程&#xff1f; 进程 进程是计算机科学中的一个核心概念&#xff0c;它指的是在操作系统中正在执行的一个程序的实例。进程是操作系统中的一个独立执行单元&#xff0c;具有独立的内存空间和系统资源。每个进程都有自己独立的地址空间和文件描述符&#x…

循环神经网络笔记

循环神经网络学习 RNN训练方法–BPTT BPTT &#xff08;Backpropagation Through Time&#xff09;&#xff0c;这是一种用于训练循环神经网络&#xff08;RNNs&#xff09;的算法。由于 RNNs 能够处理序列数据&#xff0c;并且在每个时间步上都有内部状态&#xff0c;因此需…

南京自闭症寄宿学校:打造温馨的第二家

南京自闭症寄宿学校的愿景与广州星贝育园的温馨实践 在探讨自闭症儿童教育的广阔领域中&#xff0c;寄宿制学校以其独特的优势&#xff0c;为这些特殊的孩子提供了全方位的支持与关怀&#xff0c;致力于打造一个温馨如家的第二生活环境。虽然本文的主题是围绕南京自闭症寄宿学…

Chirp通过Sui让IoT世界变得更简单

据估计&#xff0c;未来十年内&#xff0c;联网设备的数量将增长到近400亿台。无论是追踪共享出行车辆的移动、改善食品追溯性、监控制造设施&#xff0c;还是保障家庭安全&#xff0c;物联网 ( Internet of Things&#xff0c;IoT) 对企业和消费者来说都已经成为一项关键技术。…

刷题学习日记 (1) - SWPUCTF

写这篇文章主要是想看看自己一个下午能干啥&#xff0c;不想老是浪费时间了&#xff0c;所以刷多少题我就会写多少题解&#xff0c;使用nss随机刷题&#xff0c;但是今天下午不知道为啥一刷都是SWPUCTF的。 [SWPUCTF 2021 新生赛]gift_F12 控制台ctrlf搜索flag即可&#xff0…

什么是竞争条件?

竞争条件&#xff0c;简单来说就是多个进程同时访问同一个共享资源&#xff0c;导致出现预期结果以外的错误的情况。 出现竞争条件的本质原因是cpu对程序的调度是没有特定规律的&#xff0c;某一时刻cpu处理哪个进程是不确定的。 简单写一个测试程序&#xff0c;先需要子进程和…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

手机轻松解压 RAR 文件指南

手机通常不直接支持 RAR 文件打开&#xff0c;主要有以下几个原因。首先&#xff0c;手机操作系统的设计初衷并非为了处理各种复杂的压缩文件格式。 大多数手机内置的文件管理器主要侧重于管理手机内部存储和常见的文件类型&#xff0c;如图片、音频、视频等。对于像 RAR 这样…

【UR #1】外星人(dp思维技巧)

考虑去除后效性&#xff0c;常用方法排序状态可以直接以答案为状态来判断合法性考虑转移方向&#xff0c;向后转移&#xff0c;选与不选来定向答案 f[i][j]表示前i个数答案为j的方案数 不选i 则加上f[i][j] 的方案数 * &#xff08;n-i&#xff09;,ai可以在后面随便选。 选…

Python 课程20-Scikit-learn

前言 Scikit-learn 是 Python 中最流行的机器学习库之一&#xff0c;它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者&#xff0c;都可以借助它进行快速原型设计和模型开发。 在本教程中&a…

为何专利对企业创新与竞争至关重要?

在当今这个技术飞速发展的时代&#xff0c;每一个创新的火花都可能成为推动行业进步的关键力量。然而&#xff0c;创新并非一蹴而就&#xff0c;它需要时间、资金与智慧的共同投入&#xff0c;更需要一套完善的保护机制来确保其成果不被轻易窃取或模仿。这一重任&#xff0c;便…

WebPage-Bootstrap框架(container类,container-fluid类,栅格系统)

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

医院排班|医护人员排班系统|基于springboot医护人员排班系统设计与实现(源码+数据库+文档)

医护人员排班系统目录 目录 基于springboot医护人员排班系统设计与实现 一、前言 二、系统功能设计 三、系统实现 医护类型管理 排班类型管理 科室信息管理 医院信息管理 医护信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码…

“AI+Security”系列第3期(五):AI技术在网络安全领域的本地化应用与挑战

近日&#xff0c;由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办的“AI Security”系列第 3 期技术沙龙&#xff1a;“AI 安全智能体&#xff0c;重塑安全团队工作范式”活动顺利举行。此次活动吸引了线上线下超过千名观众参与。 在活动中…

shell中对xargs命令传参进行编辑

以文件解压为例&#xff0c;将当前路径下的所有gz文件解压到同名的log文件中&#xff0c;解压命令如下所示&#xff1a; ls *.gz| xargs -n 1 -P 4 -I {} bash -c zcat "{}" > $(echo "{}" | sed "s/gz$/log/g") 执行结果如下图所示&#x…

mamba-yolo模型的深度学习环境配置

本文将介绍如何配置目标检测模型mamba-yolo的深度学习环境 1. 环境要求 Python > 3.9 &#xff08;本文使用python-3.11&#xff09; CUDA > 11.6 &#xff08;本文使用CUDA-11.8&#xff09; Pytorch > 1.12.1 &#xff08;本文使用torch-2.4.0&#xff09; Linu…

【C++】STL标准模板库容器——set

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;关联式容器set(集合)简介 &#x1f4cc;set(集合)的使用 &#x1f38f;set(集合)的模板参数列表 &#x1f38f;set(集合)的构造函数 &#x1f38f;set(集合)的迭代…

JavaScript异步编程:async、await的使用

async 和 await 是在 ECMAScript 2017 (ES7) 中引入的特性&#xff0c;用于处理异步操作。它们允许你以一种更加简洁和同步的方式来编写异步代码。 async 函数表示它会返回一个 Promise&#xff0c;而 await 关键字用于等待一个 Promise 解决。 关于 promise 的详细介绍&#…

蜂窝物联网全网通sim卡切网技术方案软硬件实现教程(设备根据基站信号质量自动切网)

01 物联网系统中为什么要使用三合一卡 三合一卡为用户解决了单一运营商网络无法全覆盖的缺陷&#xff0c;避免再次采购的经济成本以及时间成本和因没有信号设备停止工作造成的损失&#xff0c;保证仅需一次采购并提高设备工作效率和入网活跃度。例如下面地区的设备&#xff0…

Spring Web MVC课后作业

目录 1.加法计算器 2.⽤户登录 3.留⾔板 1.加法计算器 &#xff08;1&#xff09;需求分析 加法计算器功能, 对两个整数进⾏相加, 需要客⼾端提供参与计算的两个数, 服务端返回这两个整数计算 的结果。 &#xff08;2&#xff09;接⼝定义 请求路径&#xff1a; calc/sum 请…