1. 程式人生 > >《劍指offer》(面試題21):包含min函式的棧

《劍指offer》(面試題21):包含min函式的棧

前言:

當一眼看不出問題中隱藏的規律的時候,我們可以試著用一兩個例子模擬操作的過程,這樣說不定就能通過具體的例子找到抽象的規律。 可以舉出一兩個例子,告訴面試官問的演算法是怎麼一步步處理這個例子的。模擬壓棧和彈出幾個數字,分析每次操作之後資料棧,輔助棧和最小值是什麼? 怎麼檢查程式碼呢?可以執行幾個測試用例。

題目描述

定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。

解題思路

我們很自然的可以想到,可以利用兩個棧來實現該操作:一個棧sData用來存放資料,另一個棧sMin用來輔助更新最小值狀態。

棧內壓入3、4、2、1之後接連兩次彈出棧頂數字之後再壓入0時,資料棧、輔助棧和最小值狀態舉例如圖所示:



python 程式碼實現:

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.sData = []
        self.sMin = []
    def push(self, node):
        # write code here
        self.sData.append(node)
        if len(self.sMin) == 0:
            self.sMin.append(node)
        if self.sMin[-1] > node:
            self.sMin.append(node)
    def pop(self):
        # write code here
        if self.sData[-1] == self.sMin[-1]:
            self.sMin.pop()
        self.sData.pop()
    def top(self):
        # write code here
        return self.sData[-1]
    def min(self):
        # write code here
        return self.sMin[-1]