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