設計包含min函式的棧

2021-05-26 04:48:55 字數 2477 閱讀 2484

本文**:

題目:定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min、push以及pop的時間複雜度都是o(1)。

分析:這是去年google的一道面試題。

我看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後push進棧的元素最先出棧,這種思路設計的資料結構已經不是乙個棧了。

在棧裡新增乙個成員變數存放最小元素(或最小元素的位置)。每次push乙個新元素進棧的時候,如果該元素比當前的最小元素還要小,則更新最小元素。

乍一看這樣思路挺好的。但仔細一想,該思路存在乙個重要的問題:如果當前最小元素被pop出去,如何才能得到下乙個最小元素?

因此僅僅只新增乙個成員變數存放最小元素(或最小元素的位置)是不夠的。我們需要乙個輔助棧。每次push乙個新元素的時候,同時將最小元素(或最小元素的位置。考慮到棧元素的型別可能是複雜的資料結構,用最小元素的位置將能減少空間消耗)push到輔助棧中;每次pop乙個元素出棧的時候,同時pop輔助棧。

#include

#include

template

class cstackwithmin

virtual ~cstackwithmin(void) {}

t& top(void);

const t& top(void) const;

void push(const t& value);

void pop(void);

const t& min(void) const;

private

:t> m_data;

// the elements of stack

size_t> m_minindex;

// the indices of minimum elements

};// get the last element of mutable stack

template

t& cstackwithmin::top()

// get the last element of non-mutable stack

template

const t& cstackwithmin::top() const

// insert an elment at the end of stack

template

void cstackwithmin::push(const t& value)

}// erease the element at the end of stack

template

void cstackwithmin::pop()

// get the minimum element of stack

template

const t& cstackwithmin::min() const

舉個例子演示上述**的執行過程:

步驟              資料棧            輔助棧                最小值

1.push 3    3          0             3

2.push 4    3,4        0,0           3

3.push 2    3,4,2      0,0,2         2

4.push 1    3,4,2,1    0,0,2,3       1

5.pop       3,4,2      0,0,2         2

6.pop       3,4        0,0           3

7.push 0    3,4,0      0,0,2         0

討論:如果思路正確,編寫上述**不是一件很難的事情。但如果能注意一些細節無疑能在面試中加分。比如我在上面的**中做了如下的工作: ·

用模板類實現。如果別人的元素型別只是int型別,模板將能給面試官帶來好印象; ·

兩個版本的top函式。在很多類中,都需要提供const和非const版本的成員訪問函式; ·

min函式中assert。把**寫的盡量安全是每個軟體公司對程式設計師的要求; ·

新增一些注釋。注釋既能提高**的可讀性,又能增加**量,何樂而不為?

總之,在面試時如果時間允許,盡量把**寫的漂亮一些。說不定**中的幾個小亮點就能讓自己輕鬆拿到心儀的offer。

上述主體思想主要是額外使用了乙個棧,用空間換取時間,另外有網友使用o(1)的空間複雜度

也完成了任務,見

該方法主體思想如下:

push時候 如果 v_push >= min, v_push 直接入棧, 如果 v_push < min, 那麼入棧的是 2 * v_push - min, 然後 min = v_push. 出棧時, 如果棧頂的top >= min 直接出,如果 top < min 則出現異常,將min作為pop的返回值,另外需要還原前乙個最小值,方法是 min = 2 * min - top,方法比較巧妙~

設計包含min函式的棧

定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素,要求函式min,push及pop的時間複雜度都是o 1 棧的資料結構包含兩個普通棧,乙個棧存資料,另乙個棧存最小值 或最小值的位置,如果用stl裡的棧,則不能存最小值的位置,因為stl裡的stack不支援下標索引訪問 cpp view ...

設計包含min函式的棧

題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 注 這是06年一道google的面試題.先來說個常規解和他的乙個優化,常規解的時間複雜度符合要求,但需要線性的額外空間.常規解 參考 除了題目要求的棧之外新開乙個棧,用來記...

設計包含min函式的棧

題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 include include define max len stack 10 typedef struct stack 輔助棧空間,儲存最小值 stack minstac...