算法筆記-隊列和棧

先進先出隊列(或簡稱隊列)

是一種基于先進先出(FIFO)策略的集合類型。

典型的先進先出隊列
隊列的API:
public class Queue<Item> implements Iterable<Item>
               Queue()                                   創(chuàng)建空隊列
         void  enqueue(Item item)                        添加一個元素
         Item  dequeue()                                 刪除最早添加的元素
       boolean isEmpty()                                 隊列是否為空
           int size()                                    隊列中的元素數(shù)量
隊列的鏈表實現(xiàn)
import java.util.Iterator;
public class Queue<Item> implements Iterable<Item> {
    
    private class Node{
        //定義節(jié)點嵌套類
        Item item;
        Node next;
    }
    
    private Node first;//指向最早添加的節(jié)點的鏈接
    private Node last;//指向最近添加的節(jié)點的鏈接
    private int count;//隊列中元素的數(shù)量
    
    
    public Queue(){
        first = null;
        last = null;
        count = 0;
    }
    
    public void enqueue(Item item){
        //向表尾添加元素
        Node oldLast = last;
        last = new Node();
        last.item = item;
        last.next = null;
        if (isEmpty()) first = last;
        else oldLast.next = last;
        count++;
    }
    
    public Item dequeue(){
        //從表頭刪除元素
        if (isEmpty()){
            return null;
        }
        
        Item item = first.item;
        first = first.next;
        count--;
        if (isEmpty())last = null;
        return item;
    }
    
    public boolean isEmpty(){
        return count==0;
    }
    
    public int size(){
        return count;
    }
    
    @Override
    public Iterator<Item> iterator() {
        return new QueueIterator();
    }
    
    private class QueueIterator implements Iterator<Item>{
        
        @Override
        public boolean hasNext() {
            return !isEmpty();
        }
        
        @Override
        public Item next() {
            return dequeue();
        }
    }
}

下壓棧(或簡稱棧)

是一種基于后進先出(LIFO)策略的集合類型

下壓棧上的操作

棧的API:

/*
 * public class Stack<Item> implements Iterable<Item>
 *              Stack()                        創(chuàng)建一個空棧
 *         void push(Item item)                添加一個元素
 *         Item pop()                          刪除最近添加的一個元素
 *      boolean isEmpty()                      棧是否為空
 *          int size()                         棧中元素的數(shù)量
 * */
棧的鏈表實現(xiàn)
import java.util.Iterator;
public class Stack<Item> implements Iterable<Item>{
    
    private class Node{
        //定義了節(jié)點嵌套類
        Item item;
        Node next;
    }
    
    private Node first; //棧頂,最近添加的元素
    private int count; //棧中元素的數(shù)量
    
    //無參構(gòu)造方法
    public Stack(){
        first = null;
        count = 0;
    }
    
    public void push(Item item){
        Node oldFirst = first;
        first = new Node();
        first.item = item;
        first.next = oldFirst;
        count++;
    }
    
    public Item pop(){
        if (isEmpty()) return null;
        
        Item item = first.item;
        first = first.next;
        count--;
        return item;
    }
    
    public boolean isEmpty(){
        return count == 0;
    }
    
    public int size(){
        return count;
    }
    
    @Override
    public Iterator<Item> iterator() {
        return new StackIterator<Item>();
    }
    
    private class StackIterator<Item> implements Iterator<Item>{
        
        @Override
        public boolean hasNext() {
            return !isEmpty();
        }
        
        @Override
        public Item next() {
            return (Item) pop();
        }
    }
    
}
挑戰(zhàn)------用有限個棧實現(xiàn)一個隊列

解答:用兩個棧實現(xiàn)一個隊列,棧0專門用來push,棧1專門用來pop戳粒,每當需要dequeue的時候,就將棧0中的元素放入棧1中,然后就可以將先進入隊列的元素pop出來了绑咱,如果需要連續(xù)pop那就直接pop就行,讓后在需要enqueue的時候就將棧1中的元素push回棧0枢泰,然后就可以繼續(xù)push了描融。雖然中間遇到多次迷之bug,但是好歹也是敲出來了??衡蚂,果然在開始敲代碼之前先理清一下思路比較好窿克,下面上代碼:

import java.util.Iterator;

/**
 * public class Queue<Item> implements Iterable<Item>
 *               Queue()                                   創(chuàng)建空隊列
 *         void  enqueue(Item item)                        添加一個元素
 *         Item  dequeue()                                 刪除最早添加的元素
 *       boolean isEmpty()                                 隊列是否為空
 *           int size()                                    隊列中的元素數(shù)量
 */
public class Squeue<Item> implements Iterable<Item>{
    
    private Stack<Item>[] stacks;
    private int count;
    
    public Squeue(){
        stacks = new Stack[2];
        stacks[0] = new Stack<Item>();
        stacks[1] = new Stack<Item>();
        count = 0;
    }
    
    public void enqueue(Item item){
        if (stacks[0].size() == 0&&count!=0){
            for (int i = 0;i < count; i++){
                stacks[0].push(stacks[1].pop());
            }
        }
        stacks[0].push(item);
        System.out.println(item);
        count++;
        System.out.println(count);
    }
    
    public Item dequeue(){
        if (isEmpty()) return null;
        if (stacks[0].size()==0) {
            count--;
            return stacks[1].pop();
        }
        
        for (int i = 0; i < count; i++){
            stacks[1].push(stacks[0].pop());
        }
        
        Item item = stacks[1].pop();
        count--;
        System.out.println(count);
        return item;
    }
    
    public boolean isEmpty(){
        return count==0;
    }
    
    public int size(){
        return count;
    }
    
    
    @Override
    public Iterator<Item> iterator() {
        return new SIterator<>();
    }
    
    private class SIterator<Item> implements Iterator<Item>{
        
        @Override
        public boolean hasNext() {
            return !isEmpty();
        }
        
        @Override
        public Item next() {
            return (Item) dequeue();
        }
    }
}
aha!忘了寫注釋
討論一下隊列和棧的鏈表實現(xiàn)和數(shù)組實現(xiàn)

鏈表實現(xiàn)因為要創(chuàng)建新對象調(diào)整關(guān)系等導(dǎo)致了總的來說速度要慢于數(shù)組實現(xiàn),但數(shù)組實現(xiàn)中會不時因為數(shù)組大小的調(diào)整而出現(xiàn)一次緩慢操作讳窟,這樣就使得需要穩(wěn)定快速的操作的情況下數(shù)組實現(xiàn)不合適让歼,但是如果只考慮總的時間消耗的話,數(shù)組實現(xiàn)是要更快的丽啡。

資源及參考

本筆記是學(xué)習(xí)普林斯頓大學(xué)算法課程以及閱讀其教材《算法》第四版所作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谋右,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子补箍,更是在濱河造成了極大的恐慌改执,老刑警劉巖啸蜜,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辈挂,居然都是意外死亡衬横,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門终蒂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜂林,“玉大人,你說我怎么就攤上這事拇泣≡胄穑” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵霉翔,是天一觀的道長睁蕾。 經(jīng)常有香客問我,道長债朵,這世上最難降的妖魔是什么子眶? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮序芦,結(jié)果婚禮上臭杰,老公的妹妹穿的比我還像新娘。我一直安慰自己芝加,他們只是感情好硅卢,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藏杖,像睡著了一般将塑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝌麸,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天点寥,我揣著相機與錄音,去河邊找鬼来吩。 笑死敢辩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的弟疆。 我是一名探鬼主播戚长,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怠苔!你這毒婦竟也來了同廉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迫肖,沒想到半個月后锅劝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡蟆湖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年故爵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隅津。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诬垂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饥瓷,到底是詐尸還是另有隱情剥纷,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布呢铆,位于F島的核電站,受9級特大地震影響蹲缠,放射性物質(zhì)發(fā)生泄漏棺克。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一线定、第九天 我趴在偏房一處隱蔽的房頂上張望娜谊。 院中可真熱鬧,春花似錦斤讥、人聲如沸纱皆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽派草。三九已至,卻和暖如春铛楣,著一層夾襖步出監(jiān)牢的瞬間近迁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工簸州, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鉴竭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓岸浑,卻偏偏與公主長得像搏存,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矢洲,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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

  • 棧 棧的英文單詞是Stack,它代表一種特殊的線性表璧眠,這種線性表只能在固定一端(通常認為是線性表的尾端)進行插入,...
    Jack921閱讀 1,501評論 0 5
  • 1.把二元查找樹轉(zhuǎn)變成排序的雙向鏈表 題目: 輸入一棵二元查找樹,將該二元查找樹轉(zhuǎn)換成一個排序的雙向鏈表蛆橡。 要求不...
    曲終人散Li閱讀 3,314評論 0 19
  • 課程介紹 先修課:概率統(tǒng)計舌界,程序設(shè)計實習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計泰演,編譯原理呻拌,操作系統(tǒng),數(shù)據(jù)庫概論睦焕,人...
    ShellyWhen閱讀 2,283評論 0 3
  • 一垃喊、棧 1.1 棧的實現(xiàn) 棧(Stack)是限制僅在表的一端進行插入和刪除運算的線性表猾普。java沒有棧這樣的數(shù)據(jù)結(jié)...
    yjaal閱讀 1,451評論 0 1
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,497評論 0 3