首页 > 其他分享 >LeetCode225.队列实现栈

LeetCode225.队列实现栈

时间:2024-03-14 14:38:16浏览次数:25  
标签:LeetCode225 调用 函数 队列 pop int push 实现

  • ques:用两个队列模拟栈(我用的是一个)
  • ans:用的C++标准库里面的Queue模板类创建实例,主要思路就是push函数里面做文章,其余函数pop/top/empty都正常实现。

  根据栈和队列的特性,插入点不变,只能是队尾,但每次插入队尾总想把他放在栈顶,所以就让队列前面的元素依次出队并排在队尾,即可保持前面队列元素扔按序,而新插入的在栈顶(队首),从而完成模拟栈。

 

  私有成员为模板类的实例对象,通过成员函数来操作该队列,在push函数中,最初尝试 q.push(q.pop());编译器报错,因为q.pop()是队列的pop API接口函数,只是弹出队首而并无返回值,而这里需要用栈Stack的实例对象来调用pop成员函数,也就是通过this指针来调用

 

#include <iostream>
#include <queue>
using namespace std;

class MyStack {
private:
    queue<int> q;

public:
    MyStack() {}

    void push(int x) {
        q.push(x);
        if (q.size() > 1) {
            for (int i = 1; i <= q.size() - 1; i++) {
                q.push(this->pop());
            }
        }
    }

    int pop() {

        int top = q.front();
        q.pop();
        return top;
    }

    int top() { return q.front(); }

    bool empty() {
        if (q.empty() == 1)
            return true;
        else
            return false;
    }
};

/**
 * 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();
 */

下面的代码确实比自己的优化许多

查看代码
 class MyStack {
public:
    MyStack() { }
    
    void push(int x) {
        int n = static_cast<int>(q.size());
        q.push(x);
        while (n--) {
            q.push(q.front());
            q.pop();
        }
    }
    
    int pop() {
        int t = q.front();
        q.pop();
        return t;
    }
    
    int top() {
        return q.front();
    }
    
    bool empty() {
        return q.empty();
    }

private:
    queue<int> q;

};
  • summary:初刷代码好多知识都忘了,也是在网上现学的思路,自己再用代码实现的,第一次通过了,不过时间和内存这些性能方面还是挺落后的,以后熟练了可以看看怎么改进。

这里构造函数为空,做题过程中稍微看了看拷贝构造函数,双端队列和优先队列,以及类成员函数之间是不能相互直接调用的,可以在一个成员函数中传参为类的实例化对象,通过该对象访问另一成员函数,解决方法:

本篇为博主在学习中遇到的问题,仅以此记录并供以后复习使用,同时希望能够帮助到有类似问题的同学。

一、同一个对象的类成员函数相互调用

如图所示,类成员函数fun2直接调用类成员函数fun,最终如果对象调用fun2则会输出fun1,证明能够如此调用。

二、参数是另一个对象的类成员函数,调用参数中对象的成员函数

1、首先第一种情况,如果是const 引用的情况

可以看到无法成功调用,报错信息指出将const 转化为&,权限扩大,因此无法调用,如果仍想这样调用,则需要对程序稍作修改。

具体修改方法有两种:

1、

 
class test {
public:
	void fun() {
		cout << '1' << endl;
	}
	void fun2(test& ano) {
		ano.fun();
	}
};


将const删除,这样就不会有权限扩大的问题

2、

class test {
public:
void fun() const {
cout << '1' << endl;
}
void fun2(const test& ano) {
ano.fun();
}
};


在被使用到的成员函数后面加const变为只读函数,而不改变类内成员的值,这样,也不会有权限扩大的问题,但是仅仅只有带const的只读函数能够被调用。

 

 

版权声明:后半部分为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_67828227/article/details/127262756

标签:LeetCode225,调用,函数,队列,pop,int,push,实现
From: https://www.cnblogs.com/mingyuer/p/18072686

相关文章

  • 基于Django(python+sql)的校园二手交易系统设计与实现(完整程序+开题报告+论文)
    摘要        随着互联网的迅猛发展,校园内的二手交易市场也逐渐呈现出蓬勃的发展态势。学生们在校园生活中会产生大量的闲置物品,而其他学生也有可能需要这些物品。本论文研究了校园二手交易系统的需求分析、系统实现和测试三个部分,旨在提高校园二手交易系统的开发和测......
  • 数字孪生与智慧城市:实现城市治理现代化的新路径
    随着信息技术的迅猛发展,智慧城市已成为城市发展的必然趋势。数字孪生技术作为智慧城市建设的重要支撑,以其独特的优势为城市治理现代化提供了新的路径。本文将探讨数字孪生技术在智慧城市中的应用,以及如何实现城市治理的现代化。一、数字孪生技术的概念及其在城市治理中的应用......
  • 学生考勤系统|基于Springboot的大学生考勤系统设计与实现(源码+数据库+文档)
    大学生考勤系统目录目录基于Springboot的大学生考勤系统设计与实现一、前言二、系统功能设计三、系统实现1、系统登录注册2、管理员功能模块四、数据库设计1、实体ER图 2、具体的表设计如下所示:五、核心代码 六、论文参考 七、最新计算机毕设选题推荐八、源码......
  • 从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载
    本文为从零开始写Docker系列第六篇,实现类似docker-v的功能,通过挂载数据卷将容器中部分数据持久化到宿主机。完整代码见:https://github.com/lixd/mydocker欢迎Star推荐阅读以下文章对docker基本实现有一个大致认识:核心原理:深入理解Docker核心原理:Namespace、Cgr......
  • 通过构造函数实现属性赋值(含有具体例子)
    一、什么是构造函数?new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)调用构造器的时候,如果你的类中没有写构造器,那么系统会默认给你分配一个构造器,只是我们看不到罢了。可以自己显式的将构造器编写出来:构造器的格式:[修饰符]构造器的名字(){}构造器和方法的......
  • 基于web的电子产品销售管理系统的设计与实现
    资源地址:https://download.csdn.net/download/u014308676/85231950资源包含了完整代码,数据库文件,完整的毕业论文word,和答辩ppt。        文档描述了实现如何构造一个B/S结构的图书馆信息管理系统,对电子产品销售管理系统的需求分析、模块的划分、数据库的实现、功能模......
  • 单目测距的基本介绍和实现原理
    单目测距的基本介绍和实现原理单目测距是一种常用的测量技术,它通过单个摄像头来测量物体与摄像头的距离。在现代科技的推动下,单目测距术正在不断发展和应用于各个领域。本文将分点阐述关于单目测距的重要性、原理和方法、应用领域以及潜在的挑战和发展方向结尾附赠非常宝贵的自......
  • 基于java+springboot+vue实现的物业管理系统(文末源码+Lw+ppt)23-23
    摘  要快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,通过线上物业管理系统也就相继涌现。与此同时,人们开始接受方便的生活方式。他们不仅希望页面简单大方,还希望操作方便,可以快......
  • 基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个停车场管......
  • 基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个停车场管......