大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 教你如何用兩個隊列實現一個棧

教你如何用兩個隊列實現一個棧

更新時間:2022-10-11 09:49:37 來源:動力節點 瀏覽1128次

如何用兩個Java隊列實現一個棧?動力節點小編來告訴大家。我們通過一系列棧的壓入和彈出操作來分析用兩個隊列模擬一個棧的過程。如圖(a)所示,我們先往棧內壓入一個元素A。由于兩個隊列現在都是空的,我們可以選擇把A插入兩個隊列的任意一個。不妨插入queue1。接下來繼續往棧內壓入B、C兩個元素,我們把它們都插入queue1。這個時候queue1包含3個元素A、B和C,其中A位于隊列的頭部,C位于隊列的尾部。

現在我們考慮從棧內彈出一個元素。根據棧的后入先出原則,最后被壓入棧的C應該最先被彈出。由于C位于queue1的尾部,而我們每次只能從隊列的頭部刪除元素,因此我們可以先從queue1中依次刪除元素A、B并插入到queue2中,再從queue1中刪除元素C。這就相當于從棧中彈出元素C了(如圖(b)所示)。我們可以用同樣的方法從棧內彈出元素B(如圖©所示)

接下來我們考慮往棧內壓入一個元素D。此時queue1已經有一個元素,我們就把D插入到queue1的尾部(如圖(d)所示)。如果我們再從棧內彈出一個元素,此時被彈出的應該是最后被壓入的D。由于D位于queue1的尾部,我們只能先從有刪除queue1的元素并插入到queue2,直到在queue1中遇到D再直接把它刪除(如圖(e)所示)。

注意在此過程中,新push進來的元素總是插入到非空隊列中,空隊列則用來保存pop操作之后的那些元素,那么此時空隊列不為空了,原來的非空隊列變為空了,總是這樣循環。

完整代碼

#include <iostream>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;
template <typename T> class CStack{
public:
    CStack(void){};
    ~CStack(void){};
    void push(const T& node);
    T pop();
private:
    queue<T> queue1;
    queue<T> queue2;
};
//插入元素:往非空的隊列中增加元素,若都為空,則默認往queue1中添加
template <typename T> void CStack<T>::push(const T& element)
{
    if (queue1.size() > 0)//如果queue1不為空則往queue1中插入元素
        queue1.push(element);
    else if (queue2.size() > 0)//如果queue2不為空則往queue2中插入元素
        queue2.push(element);
    else//如果兩個隊列都為空,則往queue1中插入元素
        queue1.push(element);
}
//刪除元素
template <typename T> T CStack<T>::pop()
{
    if (queue1.size() == 0)    //如果queue1為空
    {
        while (queue2.size() > 1)    //當queue2中大于一個元素時,則
            //將其余元素保存到queue1中,保證queue2中只有一個元素
        {
            queue1.push(queue2.front());//壓入queue1
            queue2.pop();//然后刪除
        }
        //只剩下一個元素時,即出列,此時對于由兩個隊列構成的棧而言,
        //彈出的即是最后進入的元素,符合后進先出
        T& data = queue2.front();//存儲
        queue2.pop();//而后刪除
        return data;
    }
    else   //如果queue2為空
    {
        while (queue1.size() > 1) // 當queue1中大于一個元素時,則
            //將其余元素保存到queue2中,保證queue1中只有一個元素
        {
            queue2.push(queue1.front());//壓入queue2
            queue1.pop();//然后刪除
        }
        //只剩下一個元素時,即出列,此時對于由兩個隊列構成的棧而言,
        //彈出的即是最后進入的元素,符合后進先出
        T& data = queue1.front();
        queue1.pop();
        return data;
    }
}
int main()
{
    CStack<int> stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    int len = 4;
    while (len>0)
    {
        cout << stack.pop() << " ";
        --len;
    }
    return 0;
}

對于push和pop操作,其時間為O(n).

運行結果:

以上就是關于“教你如何用兩個隊列實現一個棧”的介紹,大家如果想了解更多相關知識,不妨來關注一下本站的Java在線學習,里面的課程內容細致全面,適合沒有基礎的小伙伴學習,希望對大家的學習能夠有所幫助哦。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 青青青国产深夜福利视频 | 深夜免费福利 | 女人l8毛片a一级毛片免费 | 成人一区二区免费中文字幕 | 色人阁网站 | 99久久精品免费看国产高清 | 久久视频在线看 | 亚洲综合色视频 | 国产目拍亚洲精品区一区 | 国产欧美一区视频在线观看 | 国产成人免费全部网站 | 四虎在线永久视频观看 | 性欧美处| 国产亚洲精品2021自在线 | 四虎影视在线麻豆国产 | 色综合久久精品中文字幕首页 | 亚洲性综合 | 成人亚洲欧美综合 | 国产精品18久久久久网站 | 免费h片在线观看 | 免费国产黄线在线观看视频 | 91在线品视觉盛宴免费 | 日本xxxx色视频在线观看免 | 亚洲成年网 | 久久久久这里只有精品 | 宅男在线影院 | 久久精品国产精品青草 | 日本二三区 | 久久草在线视频播放 | 亚洲欧美韩国 | 欧美大片日韩精品四虎影视 | 国产亚洲精品久久久久久小说 | 免费观看视频成人国产 | 亚洲精品一区久久狠狠欧美 | 亚洲色妞| 狠狠色丁香婷婷综合久久片 | 亚洲精品区一区二区三区四 | 久久久夜间小视频 | 国产一区国产二区国产三区 | 国产日韩中文字幕 | 六月婷婷久香在线视频 |