設(shè)計(jì)一個(gè)有g(shù)etMin功能的棧

本題來自程序員代碼面試指南

  • 設(shè)計(jì)一個(gè)有g(shù)etMin功能的棧
    實(shí)現(xiàn)一個(gè)特殊的棧,在實(shí)現(xiàn)棧的基本功能的基礎(chǔ)上,再實(shí)現(xiàn)返回棧中最小元素的操作盲厌。
  • 要求
  1. pop馒过、push臭脓、getMin操作的時(shí)間復(fù)雜度都是O (1)。
  2. 設(shè)計(jì)的棧類型可以使用現(xiàn)成的棧結(jié)構(gòu)腹忽。
  • 解決方法
    倆個(gè)棧来累,一個(gè)是普通棧里面放數(shù)據(jù),另一個(gè)棧里面放棧中最小值
  • 第一種方法在壓棧時(shí)判斷插入時(shí)為空椌阶啵或者元素小于等于當(dāng)前棧頂元素,壓入最小值棧中嘹锁。
    如果彈棧元素大小等于(不可能小于)最小值棧頂元素,同時(shí)從最小值棧中彈出着裹。
  • 第二種方法插入的元素比當(dāng)前棧中最小值大领猾,將最小值重復(fù)入棧。
    彈棧時(shí)同時(shí)彈出數(shù)據(jù)棧和最小值棧中的一個(gè)元素骇扇。

第二種方法和第一種的區(qū)別就是第一種數(shù)據(jù)棧和最小值棧里的數(shù)據(jù)量是不相等的摔竿,在彈棧時(shí)要判斷彈出的元素是否和最小值棧棧頂元素相等,第二種方法只要彈棧就同時(shí)從最小值棧里彈出一個(gè)

public class Mystack1 implements Mystack{
    private Stack<Integer> stackData;//存儲(chǔ)數(shù)據(jù)的棧與正常棧功能相同
    private Stack<Integer> stackMin;//保存每一步的最小值

    public Mystack1() {
        this.stackData = new Stack<>();
        this.stackMin = new Stack<>();
    }

    /**
     * 壓棧操作
     *
     * @param newNum
     */
    public void push(int newNum) {
        if (this.stackMin.isEmpty()) {
            //最小值的棧是空的直接壓入
            this.stackMin.push(newNum);
        } else if (newNum <= stackMin.peek()) {
            //插入元素小于等于當(dāng)前棧頂元素,也壓入棧中
            this.stackMin.push(newNum);
        }
        //數(shù)據(jù)壓入數(shù)據(jù)棧
        this.stackData.push(newNum);
    }

    /**
     * 彈棧操作
     *
     * @return
     * @throws Exception
     */
    public int pop() throws Exception {
        //椊程猓空報(bào)錯(cuò)
        if (this.stackData.isEmpty()) {
            throw new Exception("椪兀空,無數(shù)據(jù)返回");
        }
        int pop = this.stackData.pop();
        //如果彈棧元素大小等于最小值棧頂元素韭山,同時(shí)從最小值棧中彈出
        if (pop == this.stackMin.peek()) {
            this.stackMin.pop();
        }
        return pop;
    }

    /**
     * 返回棧中最小的元素的值
     *
     * @return
     * @throws Exception
     */
    public int getMin() throws Exception {
        if (this.stackMin.isEmpty()) {
            //最小值椨艏荆空報(bào)錯(cuò)
            throw new Exception("椑淅#空");
        }
        return this.stackMin.peek();
    }
}
public class Mystack2 implements Mystack{
    private Stack<Integer> stackData;//存儲(chǔ)數(shù)據(jù)的棧與正常棧功能相同
    private Stack<Integer> stackMin;//保存每一步的最小值

    public Mystack2() {
        this.stackData = new Stack<>();
        this.stackMin = new Stack<>();
    }

    /**
     * 壓棧操作
     *
     * @param newNum
     */
    public void push(int newNum) {
        if (this.stackMin.isEmpty()) {
            //最小值的棧是空的直接壓入
            this.stackMin.push(newNum);
        } else if (newNum <= stackMin.peek()) {
            //插入元素小于等于當(dāng)前棧頂元素,也壓入棧中
            this.stackMin.push(newNum);
        } else {
            //插入的元素比當(dāng)前棧中最小值大,將最小值重復(fù)入棧
            this.stackMin.push(this.stackMin.peek());
        }
        //數(shù)據(jù)壓入數(shù)據(jù)棧
        this.stackData.push(newNum);
    }

    /**
     * 彈棧操作
     *
     * @return
     * @throws Exception
     */
    public int pop() throws Exception {
        //椕瘟眩空報(bào)錯(cuò)
        if (this.stackData.isEmpty()) {
            throw new Exception("椝普恚空,無數(shù)據(jù)返回");
        }
        //同時(shí)彈出數(shù)據(jù)棧和最小值棧中的一個(gè)元素
        int pop = this.stackData.pop();
        this.stackMin.pop();
        return pop;
    }

    /**
     * 返回棧中最小的元素的值
     *
     * @return
     * @throws Exception
     */
    public int getMin() throws Exception {
        if (this.stackMin.isEmpty()) {
            //最小值椖昴空報(bào)錯(cuò)
            throw new Exception("椩浼撸空");
        }
        return this.stackMin.peek();
    }
}
性能測試

循環(huán)一千萬次發(fā)現(xiàn)第二種方法的運(yùn)算時(shí)間上要少于第一種算法,這大概就是空間換時(shí)間吧
最后附上github地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冗恨,一起剝皮案震驚了整個(gè)濱河市答憔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掀抹,老刑警劉巖虐拓,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異傲武,居然都是意外死亡蓉驹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門揪利,熙熙樓的掌柜王于貴愁眉苦臉地迎上來态兴,“玉大人,你說我怎么就攤上這事疟位≌叭螅” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵甜刻,是天一觀的道長敢订。 經(jīng)常有香客問我,道長罢吃,這世上最難降的妖魔是什么楚午? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮尿招,結(jié)果婚禮上矾柜,老公的妹妹穿的比我還像新娘。我一直安慰自己就谜,他們只是感情好怪蔑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丧荐,像睡著了一般缆瓣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虹统,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天弓坞,我揣著相機(jī)與錄音隧甚,去河邊找鬼。 笑死渡冻,一個(gè)胖子當(dāng)著我的面吹牛戚扳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播族吻,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼帽借,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了超歌?” 一聲冷哼從身側(cè)響起砍艾,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巍举,沒想到半個(gè)月后辐董,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禀综,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苔严。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定枷。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖届氢,靈堂內(nèi)的尸體忽然破棺而出欠窒,到底是詐尸還是另有隱情,我是刑警寧澤退子,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布岖妄,位于F島的核電站,受9級特大地震影響寂祥,放射性物質(zhì)發(fā)生泄漏荐虐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一丸凭、第九天 我趴在偏房一處隱蔽的房頂上張望福扬。 院中可真熱鬧,春花似錦惜犀、人聲如沸铛碑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汽烦。三九已至,卻和暖如春莉御,著一層夾襖步出監(jiān)牢的瞬間撇吞,已是汗流浹背俗冻。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梢夯,地道東北人言疗。 一個(gè)月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像颂砸,于是被迫代替她去往敵國和親噪奄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

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