- 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