LeetCode225.队列实现栈

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

posted @ 2024-03-14 14:09  蔡姬小媛  阅读(27)  评论(0)    收藏  举报