劍指offer之兩個(gè)棧實(shí)現(xiàn)隊(duì)列問題

1 問題

兩個(gè)棧實(shí)現(xiàn)隊(duì)列的插入和獲取頭部元素的功能

2 分析

我們定義連個(gè)棧stack1,stack2,當(dāng)隊(duì)列彈出頭部元素的時(shí)候,我們知道隊(duì)列先進(jìn)后出,我們先把一個(gè)元素壓到stack1,然后再壓一個(gè)元素到stack1,然后我們把stack1的top函數(shù)得到棧頂值然后pop彈出來,push到stack2里面去,這個(gè)時(shí)候后面進(jìn)的元素就在stack2的棧底,然后我們?cè)侔裺tack1的top函數(shù)得到棧頂值然后pop彈出來,push到stack2里面去,這個(gè)時(shí)候我們stack2的top()棧頂函數(shù)也就是我們第一個(gè)壓到stack1的元素,我們只需要把stack2的top()的值獲取就是隊(duì)列的第一個(gè)元素。

簡(jiǎn)言之

隊(duì)列獲取頭部元素的功能:如果stack2里面沒有元素,我們需要把stack1里面的元素從棧頂一個(gè)一個(gè)彈出來壓入到stack2,當(dāng)獲取隊(duì)列的頭部值的時(shí)候,我們只需要獲取stack2的頂部元素值(top方法)就行,然后把這個(gè)值pop出來,如果stack2里面有元素,我們直接獲取stack2的頂部元素值(top方法)就行,然后把這個(gè)值pop出來。

插入隊(duì)列元素的功能,我們只需要把元素直接push到stack1里面就行,不管stack2里面有沒有值。


 
3 代碼實(shí)現(xiàn)

    #include <iostream>
    #include <stack>
     
    using namespace std;
     
    class student
    {
    public:
        student(){}
        ~student(){}
        student(std::string name, std::string age, std::string sex)
        {
            this->name = name;
            this->age = age;
            this->sex = sex;
        }
        void toString()
        {
            std::cout << "name is "<< name << " age is "<< age << " sex is "<< sex << std::endl;
        }
    private:
        std::string name;
        std::string age;
        std::string sex;
    };
     
    template <typename T>
    class Test
    {
    public:
        Test(){}
        ~Test(){}
        Test(const T& t);
        //往隊(duì)列里面添加元素
        void add(const T& t);
        //往隊(duì)列里面刪除元素
        T top();
    private:
        std::stack<T> stack1;
        std::stack<T> stack2;
    };
     
    template <typename T> void Test<T>::add(const T& t)
    {
        stack1.push(t);
    }
     
    template <typename T> T Test<T>::top()
    {
        if (stack2.empty())
        {
            //注意這里是while 不是if,我們需要把stack1里面的數(shù)據(jù)全部彈出來放到stack2里面去
            while (!stack1.empty())
            {
                T& value = stack1.top();
                stack1.pop();
                stack2.push(value);
            }
        }
        
        T top = stack2.top();
        stack2.pop();
        return top;
        
    }
    int main() {
        
        student std1("chenyu", "27", "man");
        student std2("chencaifeng", "27", "woman");
        student std3("chenzixuan", "3", "woman");
        student std4("chenzixi", "2", "woman");
        student std5("chenxuan", "21", "woman");
        
        Test<student> queue;
        queue.add(std1);
        queue.add(std2);
        queue.add(std3);
        queue.add(std4);
        
        student top1 = queue.top();
        top1.toString();
        student top2 = queue.top();
        top2.toString();
        student top3 = queue.top();
        top3.toString();
        
        queue.add(std5);
        student top4 = queue.top();
        top4.toString();
        student top5 = queue.top();
        top5.toString();  
     
        return 0;
    }


 
4 運(yùn)行結(jié)果

    name is chenyu age is 27 sex is man
    name is chencaifeng age is 27 sex is woman
    name is chenzixuan age is 3 sex is woman
    name is chenzixi age is 2 sex is woman
    name is chenxuan age is 21 sex is woman
     
     

 



 



 


作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)