LeetCode225.佇列實現棧

蔡姬小媛發表於2024-03-14
  • 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:初刷程式碼好多知識都忘了,也是在網上現學的思路,自己再用程式碼實現的,第一次透過了,不過時間和記憶體這些效能方面還是挺落後的,以後熟練了可以看看怎麼改進。

這裡建構函式為空,做題過程中稍微看了看複製建構函式,雙端佇列和優先佇列,以及類成員函式之間是不能相互直接呼叫的,可以在一個成員函式中傳參為類的例項化物件,透過該物件訪問另一成員函式,解決方法:

本篇為博主在學習中遇到的問題,僅以此記錄並供以後複習使用,同時希望能夠幫助到有類似問題的同學。

一、同一個物件的類成員函式相互呼叫

LeetCode225.佇列實現棧

如圖所示,類成員函式fun2直接呼叫類成員函式fun,最終如果物件呼叫fun2則會輸出fun1,證明能夠如此呼叫。

二、引數是另一個物件的類成員函式,呼叫引數中物件的成員函式

1、首先第一種情況,如果是const 引用的情況

LeetCode225.佇列實現棧

LeetCode225.佇列實現棧

可以看到無法成功呼叫,報錯資訊指出將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

相關文章