1. 程式人生 > >包含min函式的棧

包含min函式的棧

題目描述:

定義棧的資料結構,請在該型別中實現一個能夠得到棧中所含最小元素的min函式(時間複雜度應為O(1))。

程式碼實現:

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

思路:

通常所見的棧的操作都是push和pop,這次需要包含min***作,這個***作的實現,需要藉助一個輔助棧來記錄每次進/出棧後當時的最小值。

當需要進站時,原棧正常進棧,輔助棧需要檢查進棧元素與當前的棧頂元素的大小關係,如果比當前的棧頂元素大,就不進棧,若小則說明該元素進棧後的最小值是它本身,他也要進入輔助棧,以記錄此時的最小值。

當需要出棧時,原棧正常出棧,輔助棧,需要判斷出棧元素與棧頂元素的大小關係,若相同,則輔助棧也出棧,因為原棧中最小值出去了,最小值改變了,變為輔助棧的下一個元素(挨著棧頂的元素)。若不相同,則輔助棧不用出棧,最小值還是輔助棧中的棧頂元素。