怎樣應(yīng)對(duì)IT面試與筆試-(三)

1.1.4 棧stack與隊(duì)列queue

棧stack

部分定義參考自百度百科

  • 棧(stack)在計(jì)算機(jī)科學(xué)中是限定僅在表尾進(jìn)行插入或刪除操作的線性表,,是一種后進(jìn)先出(LIFO )的數(shù)據(jù)結(jié)構(gòu)缠诅。
  • 棧是一種數(shù)據(jù)結(jié)構(gòu)乍迄,它按照后進(jìn)先出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底闯两,最后的數(shù)據(jù)在棧頂谅将,需要讀數(shù)據(jù)的時(shí)候從棧頂開始彈出數(shù)據(jù)重慢。
  • 棧是只能在某一端插入和刪除的特殊線性表。
  • 棧的底層實(shí)現(xiàn)是基于數(shù)組或者鏈表
  • c++ stl中stack是一個(gè)容器適配器似踱,stack默認(rèn)的基礎(chǔ)容器為deque容器(一種雙端都可以進(jìn)行刪除插入操作的數(shù)據(jù)結(jié)構(gòu))

下面的例子說明圖片來自維基百科:


Lifo_stack.png
queue隊(duì)列

部分定義參考自百度百科隊(duì)列

  • 隊(duì)列是一種特殊的線性表屯援,是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)念脯。
  • 隊(duì)列只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作绿店。進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭假勿。
  • 隊(duì)列的底層實(shí)現(xiàn)也是基于數(shù)組或者鏈表。
  • c++ stl中queue是一個(gè)容器適配器恶导,vector浸须、list和deque都能夠作為queue的基礎(chǔ)容器,而與stack一樣queue默認(rèn)的基礎(chǔ)容器也為deque容器
queue.png

232. Implement Queue using Stacks

使用stack模擬實(shí)現(xiàn)queue的功能裂垦,包括push肌索、pop、peek诚亚、empty

1.舉例子-畫圖-解題思路

實(shí)現(xiàn)queue的push,意味著每次的元素都要放在stack的底部届巩,為了完成這樣的效果,我們首先需要把stack1中的元素挨個(gè)取出放到輔助棧stack2中恕汇,然后把新來的元素直接放到stack1中,最后把stack2中的元素取出來再放到stack1中瘾英。

push示意圖:


stack-queue.png

pop示意圖:


queue的pop即stack1的top+pop操作(c++的stack缺谴,top只返回最頂元素,不會(huì)出棧湿蛔,pop才會(huì)執(zhí)行出棧操作)

2. 寫核心邏輯代碼
class MyQueue {
public:
    /** Initialize your data structure here. */
    MyQueue() {
        
    }
    
    /** Push element x to the back of queue. */
    void push(int x) {
        stack<int> stack2;
        // 將stack1中的元素移動(dòng)到stack2中
        while(!stack1.empty())
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
        //將新push的元素放入stack1中
        stack1.push(x);
        //將stack2中的元素放回stack1中
        while(!stack2.empty())
        {
            stack1.push(stack2.top());
            stack2.pop();
        }
    }
    
    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        //top方法只返回棧的頂值,不會(huì)出棧
        int value = stack1.top();
        //出棧操作是pop添谊,但沒有返回值
        stack1.pop();
        return value;
    }
    
    /** Get the front element. */
    int peek() {
        return stack1.top();
    }
    
    /** Returns whether the queue is empty. */
    bool empty() {
        return stack1.empty();
    }
private:
    stack<int> stack1;
};
3. 邊界條件-無
4. 優(yōu)化

每次push元素都要把元素經(jīng)歷stack1-stack2-stack1這樣的流程是有些浪費(fèi)的察迟。可以考慮一種lazy的方式扎瓶,同樣準(zhǔn)備數(shù)據(jù)結(jié)構(gòu)與算法兩個(gè)stack,pushi時(shí)候新元素直接放到stack1,pop或者peek時(shí)候削彬,先看stack2中是否有元素,有直接出棧,沒有則把stack1中的元素移動(dòng)到stack2中。

class MyQueue {
public:
    /** Initialize your data structure here. */
    MyQueue() {
        
    }
    
    /** Push element x to the back of queue. */
    void push(int x) {
        stack1.push(x);
    }
    
    void shiftStack()
    {
        if(stack2.empty())
        {
            while(!stack1.empty())
            {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
    }
    
    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        shiftStack();
        if(!stack2.empty())
        {
            int value = stack2.top();
            stack2.pop();
            return value;
        }
        return 0;
    }
    
    /** Get the front element. */
    int peek() {
        shiftStack();
        if(!stack2.empty())
        {
            return stack2.top();
        }
        return 0;
    }
    
    /** Returns whether the queue is empty. */
    bool empty() {
        return stack1.empty() && stack2.empty();
    }

private:
    stack<int> stack1,stack2;
};

5. 小結(jié)

stack 經(jīng)常作為一種輔助手段實(shí)現(xiàn)更為復(fù)雜的一些算法(圖的深度優(yōu)先遍歷)改鲫,我們后面也會(huì)看到。常用的語言c++/java中都內(nèi)置了stack的數(shù)據(jù)類型像棘,請(qǐng)小伙伴們嘗試?yán)斫夂褪褂胹tack〗厍福框架圖將在225題目的小結(jié)中一并給出烟零。

225. Implement Stack using Queues

使用隊(duì)列queue模擬實(shí)現(xiàn)stack的push咸作、pop、top记罚、empty函數(shù)

1.舉例子-畫圖-解題思路

先考慮利用queue實(shí)現(xiàn)stack的push函數(shù)壳嚎。我們要想辦法每次把push的數(shù)據(jù)放到q1(queue)的頭部,這時(shí)需要借助另外一個(gè)q2(queue)烟馅,push到q1前先把q1中的數(shù)據(jù)依次取出放到q2中,然后將新數(shù)據(jù)push到q1中刊驴,最后把q2中數(shù)據(jù)依次取出再放回q1中穿撮。

217-op (7).png
2. 寫核心邏輯代碼
class MyStack {
public:
    /** Initialize your data structure here. */
    MyStack() {
        
    }
    
    /** Push element x onto stack. */
    void push(int x) {
        queue<int> q2;
        //step1 step2 將queue1中元素放到queue2中
        while(!q1.empty())
        {
            q2.push(q1.front());
            q1.pop();
        }
        // step2 將新元素放到queue1中
        q1.push(x);
         //step3 setp4 再將queue2中元素放回queue1中
        while(!q2.empty())
        {
            q1.push(q2.front());
            q2.pop();
        }
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int value = q1.front();
        q1.pop();
        return value;
    }
    
    /** Get the top element. */
    int top() {
        return q1.front();
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return q1.empty();
    }
private:
    queue<int> q1;

};

3. 邊界條件

題目已經(jīng)幫我們限制了各種邊界條件痪欲,不用在代碼中說明

4. 優(yōu)化

還有一種解法是只用一個(gè)queue來完成stack的push函數(shù)。具體思路是:將新元素push到queue1中栗柒,然后將新元素之前的各個(gè)元素依次取出來放到新元素后面知举,這樣新元素最后就位于queue1的頭部了。

//我們只重寫這個(gè)push函數(shù)逛钻,其他函數(shù)的實(shí)現(xiàn)與未優(yōu)化前的版本一致
/** Push element x onto stack. */
void push(int x) {
    int length = q1.size();
    q1.push(x);
    while(length--)
    {
        q1.push(q1.front());
        q1.pop();
    }
}
5. 小結(jié)

queue也經(jīng)常作為一種輔助手段實(shí)現(xiàn)更為復(fù)雜的一些算法(圖的廣度優(yōu)先遍歷)锰提,我們后面也會(huì)遇到相應(yīng)的例子。常用的語言c++/java中也都內(nèi)置了queue的數(shù)據(jù)類型立肘。

怎樣應(yīng)對(duì)IT面試與筆試-(一)
怎樣應(yīng)對(duì)IT面試與筆試-(二)
怎樣應(yīng)對(duì)IT面試與筆試-(三)
怎樣應(yīng)對(duì)IT面試與筆試-(四)
怎樣應(yīng)對(duì)IT面試與筆試-(五)
怎樣應(yīng)對(duì)IT面試與筆試-(五-1)
怎樣應(yīng)對(duì)IT面試與筆試-(六)
怎樣應(yīng)對(duì)IT面試與筆試-(七)
怎樣應(yīng)對(duì)IT面試與筆試-(八)
怎樣應(yīng)對(duì)IT面試與筆試-(九)
怎樣應(yīng)對(duì)IT面試與筆試-(十)
怎樣應(yīng)對(duì)IT面試與筆試-(十一)
怎樣應(yīng)對(duì)IT面試與筆試-(十二)
怎樣應(yīng)對(duì)IT面試與筆試-(十三)
怎樣應(yīng)對(duì)IT面試與筆試-(十四)
怎樣應(yīng)對(duì)IT面試與筆試-(十五)
怎樣應(yīng)對(duì)IT面試與筆試-(十六)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茧痒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子旺订,更是在濱河造成了極大的恐慌,老刑警劉巖耸峭,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳闹,死亡現(xiàn)場(chǎng)離奇詭異院究,居然都是意外死亡本涕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門样漆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晦闰,“玉大人,你說我怎么就攤上這事呻右。” “怎么了眉撵?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵落塑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我憾赁,道長(zhǎng),這世上最難降的妖魔是什么龙考? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任洲愤,我火速辦了婚禮,結(jié)果婚禮上柬赐,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好束世,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布床玻。 她就那樣靜靜地躺著,像睡著了一般锈死。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上其屏,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天缨该,我揣著相機(jī)與錄音,去河邊找鬼贰拿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妙真,可吹牛的內(nèi)容都是我干的询一。 我是一名探鬼主播隐孽,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼踢俄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起都办,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤琳钉,失蹤者是張志新(化名)和其女友劉穎势木,沒想到半個(gè)月后歌懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甫男,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了又跛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片若治。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖直砂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情静暂,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布摹迷,位于F島的核電站郊供,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驮审。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一地来、第九天 我趴在偏房一處隱蔽的房頂上張望熙掺。 院中可真熱鬧未斑,春花似錦币绩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寞蚌。三九已至,卻和暖如春固额,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斗躏。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工昔脯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人云稚。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像燕雁,于是被迫代替她去往敵國和親鲸拥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拐格,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 容器的概念所謂STL容器捏浊,即是將最常運(yùn)用的一些數(shù)據(jù)結(jié)構(gòu)(data structures)實(shí)現(xiàn)出來撞叨。容器是指容納特定...
    飯飯H閱讀 381評(píng)論 0 0
  • 棧 棧的英文單詞是Stack,它代表一種特殊的線性表,這種線性表只能在固定一端(通常認(rèn)為是線性表的尾端)進(jìn)行插入牵敷,...
    Jack921閱讀 1,501評(píng)論 0 5
  • 復(fù)盤內(nèi)容:視聽說Unit3 1在本文中我學(xué)到的最重要的概念 讓人覺得賞心悅目的風(fēng)景劣领,自在的放松的態(tài)度會(huì)讓我對(duì)一個(gè)城...
    103王舒閱讀 261評(píng)論 1 0
  • 這次是真的要失去你了饼丘,昨天千里迢迢趕回來,就為了你一句想我了,結(jié)果插曲不斷油啤,開始聽到她去了的消息蟀苛,心情跌倒谷底益咬,連...
    潔妹兒閱讀 134評(píng)論 0 0
  • 籃球場(chǎng)內(nèi)人滿為患帜平,每個(gè)半場(chǎng)都有3,4個(gè)隊(duì)接撥冗锁。籃球場(chǎng)外的水泥道上卻沒有人冻河。兩只麻雀在籃球場(chǎng)和道路之間的綠化帶叢里鉆...
    空靈一月閱讀 236評(píng)論 0 1