数据结构之栈和队列---c++

news2024/10/6 12:20:50

栈和队列的简单介绍

栈是一个“先进后出”结构
栈

队列

入队演示

队列是一种“先进先出”的结构
入队

出队演示

出队
接下来我们开始本次的内容

栈实现队列

在这里插入图片描述

分析

1.我们可以老老实实的写一个栈然后将所有的接口函数实现出来,最后再进行实现队列,但是显然是效率低下的方法
2.我们使用数组模拟栈,然后再进行实现队列—可行
3.或者直接使用STL

算法演示

栈实现队列动画演示

开始实现

class MyQueue {
public:
		//我们不需要使用他的函数,因为我不想传参
		//定义两个stack一个是输入栈,一个是输出栈
        stack<int> pushst;
        stack<int> popst;
    MyQueue() {
    }
    
    //将元素输入到输入栈中
    void push(int x) {
        pushst.push(x);
    }
    
    int pop() {
        int res;//定义一个int型的值,用来接受返回值
         
         //pop的时候是从输出栈的栈顶出数据
         //如果输出栈为空,判断输入栈有没有数据,只有输入栈有数据的时候才能进行转移
         //只有输出栈有数据才能进行pop
 		//我们可以将顺序进行转换,但是需要进行重复的步骤
 		//也就是说,1.一开始popst没有元素为空,
 		//2.pushst有值,将pushst的元素转移到popst中,
 		//3.在进行popst不为空的判断进行pop那么
         //1.3步是相同的操作,如果将2换到最前面,后面只需要紧跟一个1步骤就能完成操作
        if(!popst.size()) 
        {
            while(pushst.size())
            {
                popst.push(pushst.top());
                pushst.pop();
            }
        }
        if(popst.size())
            res=popst.top(),popst.pop();
            return res;
    }
    
    //同上
    int peek() {
        int res;
         
        if(!popst.size()) 
        {
            while(pushst.size())
            {
                popst.push(pushst.top());
                pushst.pop();
            }
            
        }
        if(popst.size())
            res=popst.top();
            return res;
    }   
    
    //当pushst和popst同时没有值的时候->空
    bool empty() {
        if(pushst.size()||popst.size()) return false;
        return true;
    }
};

队列实现栈

算法演示

进栈

进栈

出栈

出栈

开始实现

c++中queue是双端队列,但是我们不适用这个特性,我们一点点的实现

class MyStack {
public:
	
    queue<int> q1,q2;
    MyStack() {

    }
     
    //使用假设的方式,定义空队列,进行判断是否与自己的假设相反,再空的队列中添加元素
    void push(int x) {
        queue<int>* em=&q1,*noem=&q2;
        if(!em->size()) noem=em,em=&q2;
        em->push(x);
    }
    
    //在pop的时候需要将不为空的队列找到,然后使队列中只剩一个元素,其余的元素全部移入另一个队列中,最后将这个元素记录并且删除
    int pop() {
        queue<int>* em=&q1,*noem=&q2;
        if(!noem->size()) em=noem,noem=&q1;
        while(noem->size()>1)
        {
            em->push(noem->front());
            noem->pop();
        }
        int res=0;
        if(noem->size()==1)
        {
            res=noem->front();
            noem->pop();
        }
        return res;
    }
    
    //同上
    int top() {
        queue<int>* em=&q1,*noem=&q2;
        if(!noem->size()) em=noem,noem=&q1;
        while(noem->size()>1)
        {
            em->push(noem->front());
            noem->pop();
        }
        int res=0;
        if(noem->size()==1)
        {
            res=noem->front();
            em->push(noem->front());
            noem->pop();

        }
        return res;
    }
    
    bool empty() {
        if(q1.size()||q2.size()) return false;
        return true;
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

设计循环队列

在这里插入图片描述

算法演示

在这里插入图片描述

开始实现

//使用数组进行实现,结构体需要包含数组,实际使用的空间个数,头,尾
typedef struct {
    int* a;
    int k;
    int hh,tt;
} MyCircularQueue;

//当头和尾重合的时候就是空的时候
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->hh==obj->tt;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->tt+1)%(obj->k+1)==obj->hh ;
}   
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* queue=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    queue->a=(int*)malloc(sizeof(int)*(k+1));
    queue->k=k;
    queue->hh=queue->tt=0;
    return queue;
}
//对特殊情况进行判断,当tt位于最后一个的时候,需要将他从重新置为开头
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj)) return false;

    obj->a[obj->tt++]=value;
    obj->tt%=(obj->k+1);
    
    return true;
}
//对特殊情况进行判断,当hh位于最后一个的时候,需要将他从重新置为开头
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)) return false;
    
    obj->hh++;
    obj->hh%=(obj->k+1);
    return true;
}   
//如果为空直接返回-1,不为空返回相应的值
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)) return -1;
    
    return obj->a[obj->hh];
}
//最后一个数据是在tt的前一个位置,同时当tt位于开头的时候需要找到最后的位置找值
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)) return -1;
    
    return obj->a[(obj->tt+obj->k)%(obj->k+1)];
}


void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}

/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 
 * bool param_2 = myCircularQueueDeQueue(obj);
 
 * int param_3 = myCircularQueueFront(obj);
 
 * int param_4 = myCircularQueueRear(obj);
 
 * bool param_5 = myCircularQueueIsEmpty(obj);
 
 * bool param_6 = myCircularQueueIsFull(obj);
 
 * myCircularQueueFree(obj);
*/

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

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

相关文章

git开发过程中的使用

1、先创建本地分支&#xff0c;然后修改代码 2、本地提交 push 3、合并为主分支 回到master分支

【【萌新的STM32 学习-6】】

萌新的STM32 学习-6 BSP 文件夹&#xff0c;用于存放正点原子提供的板级支持包驱动代码&#xff0c;如&#xff1a;LED、蜂鸣器、按键等。 本章我们暂时用不到该文件夹&#xff0c;不过可以先建好备用。 CMSIS 文件夹&#xff0c;用于存放 CMSIS 底层代码&#xff08;ARM 和 ST…

Linux——设备树

目录 一、Linux 设备树的由来 二、Linux设备树的目的 1.平台识别 2.实时配置 3.设备植入 三、Linux 设备树的使用 1.基本数据格式 2.设备树实例解析 四、使用设备树的LED 驱动 五、习题 一、Linux 设备树的由来 在 Linux 内核源码的ARM 体系结构引入设备树之前&#x…

Vue——webpack

webpack 一、Install1.全局安装2.局部安装 二、总结1.打包2.定义脚本3.配置文件定义&#xff08;webpack.config.js)4.项目重新加载依赖5.webpack打包Css6.style-loader 一、Install 1.全局安装 npm install webpack webpack-cli -g2.局部安装 以项目为单位&#xff0c;一个项…

2023中国数字人力峰会|用「消失的Ta」解读数字化人效管理

7月28日&#xff0c;DHR公会主办的「2023中国数字人力峰会」在北京顺利举办。盖雅工场联合创始人兼CEO章新波带来主题为「消失的它」的精彩分享。以下为分享内容&#xff1a; 近期&#xff0c;大家都在讨论消失的Ta&#xff0c;我也想借此话题举几个例子&#xff0c;聊聊对于企…

thinkphp8.0多应用模式下提示控制器不存在

thinkphp 8.0 开启多应用模式 1、按照官方文档说明 &#xff0c;已经安装了 think-multi-app composer require topthink/think-multi-app 2、控制器的命名空间也没写错。 3、访问路径与目录名、控制器、方法名一样&#xff0c;访问地址是没错的。 4、网上有说&#xff0c;在…

实现vscode上用gdb调试stm32

实现vscode上用gdb调试stm32 这周负责编写设备的某个模块&#xff0c;其中遇到了一些变量地址不正确的错误&#xff0c;按理这种底层变量错误用gdb一类的调试器就能很快查到&#xff0c;可是初入嵌入式一行&#xff0c;此C语言非彼C语言&#xff0c;对于gdb怎么对接到项目上根…

冠达管理投资前瞻:三星加码机器人领域 大信创建设提速

上星期五&#xff0c;沪指高开高走&#xff0c;盘中一度涨超1%打破3300点&#xff0c;但随后涨幅收窄&#xff1b;深成指、创业板指亦强势震动。截至收盘&#xff0c;沪指涨0.23%报3288.08点&#xff0c;深成指涨0.67%报11238.06点&#xff0c;创业板指涨0.95%报2263.37点&…

vue 在方法里用字符串赋值图片路径获取不到,提示找不到图片

原因 直接通过字符串赋值命名路径是不会生效的&#xff0c;如 this.file1"../assets/addmodel/TAR.png" 因为在Vue模板中直接使用字符串赋值的方式不会被解析为正确的资源路径。 你可以使用动态绑定&#xff08;v-bind 或简写为 :&#xff09;来设置图片的路径。…

基于Spring Boot的医院预约挂号网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的医院预约挂号网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

边写代码边学习之LSTM

1. 什么是LSTM 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径&#xff0c;让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…

K8S系列文章之 使用Kind部署K8S 并发布服务

简单介绍 kind 即 Kubernetes In Docker&#xff0c;顾名思义&#xff0c;就是将 k8s 所需要的所有组件&#xff0c;全部部署在一个docker容器中&#xff0c;是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用&#xff0c;但是如果你只是想在本地简单…

从零开始学Python(Ⅰ)基本变量与数据类型

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Python的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.关于Python的基本知识&#xff08;变量…

python爬虫之scrapy框架介绍

一、Scrapy框架简介 Scrapy 是一个开源的 Python 库和框架&#xff0c;用于从网站上提取数据。它为自从网站爬取数据而设计&#xff0c;也可以用于数据挖掘和信息处理。Scrapy 可以从互联网上自动爬取数据&#xff0c;并将其存储在本地或在 Internet 上进行处理。Scrapy 的目标…

ffmpeg+nginx实现rtsp协议摄像头web端播放

ffmpegnginx实现rtsp协议摄像头web端播放 环境准备准备nginx环境添加rtmp模块添加hls转发 使用ffmpeg&#xff0c;将摄像头rtsp转为rtmp并推送到nginxVLC播放验证 环境准备 nginx&#xff08;需要安装rtmp模块&#xff09;ffmpeg 6.0vlc播放器&#xff08;本地播放验证&#x…

这个酒店管理方法太酷了!赶紧试试吧

安全是酒店管理中最重要的优先事项之一&#xff0c;酒店保障住客和员工的生命安全是不可妥协的责任。为了有效预防和应对潜在的火灾风险&#xff0c;引入烟感监控系统是一种普遍且高效的解决方案。 烟感监控系统通过及时检测烟雾和火源&#xff0c;及时发出警报和采取措施&…

Nacos单点部署

文章目录 一、Nacos概述二、部署Nacos&#xff08;1&#xff09;容器部署 三、注册服务四、整合外部的Mysql&#xff08;单节点&#xff09; 一、Nacos概述 Nacos是什么&#xff1f; Nacos的全称是Dynamic Naming and Configuration Service&#xff0c;是阿里巴巴推出来的一个…

系统函数和状态方程的转换

1.问题介绍 之前碰到这样一个问题&#xff1a;给定一个正弦信号以及系统传递函数&#xff0c;利用该系统传递函数进行卡尔曼滤波。 利用卡尔曼进行滤波首先要知道系统的状态方程&#xff0c;那么题目只给了系统传递函数&#xff0c;如何能够得到状态方程呢&#xff1f; 首先…

C++ 多线程:std::future

std::future std::future 简介示例1博客引用来源 std::future 简介 我们前面介绍的std::thread 是C11中提供异步创建多线程的工具&#xff0c;只能是异步运行任务&#xff0c;却无法获取任务执行的结果&#xff0c;一般都是依靠全局对象&#xff0c;全局对象在多线程下是及其不…

Python连接Hive实例教程

一 Python连接hive环境实例 经在网络查询相关的教程&#xff0c;发现有好多的例子&#xff0c;发现连接底层用的的驱动基本都是pyhive和pyhs2两种第三方库的来连接的 hive,下面将简介windows 10 python 3.10 连接hive的驱动程序方式&#xff0c;开发工具&#xff1a;pycharm …