包含min函式的棧和兩個棧實現乙個佇列

2021-09-22 08:59:46 字數 2780 閱讀 6443

題目:定義棧的資料結構,要求新增乙個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

: deque

m_data; //

the elements of stack

dequem_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

另一道題目:用兩個棧實現乙個佇列的功能。

要求給出演算法和思路!

答:設2個棧為a,b, 一開始均為空.

入隊:若a有空間,將新元素push入棧a;

若a滿則判斷b是否有元素,有則無法進佇列;若無則將棧a中所有元素依次pop出並push到棧b,將新元素push進a

出隊:(1)判斷棧b是否為空;

(2)如果不空,則b的棧頂元素出棧;如果為空,則將棧a中所有元素依次pop出並push到棧b;

(3)將棧b的棧頂元素pop出;

兩個棧都是空時隊列為空

這樣實現的隊列入隊和出隊的平攤複雜度都還是o(1)。

templateclass

cqueue

~cqueue() {}

t deletehead(); //

remove the front element from head and return it

bool

isempty();

private

: stack

m_stack1;

stack

m_stack2;

};//

true if the queue has no elements

templatebool cqueue::isempty()//

//delete the head from the queue and return it

templatet cqueue

::deletehead()

}//push the element into m_stack2

assert(m_stack2.size() > 0

); t data =m_stack2.top();

m_stack2.pop();

return

data;

}

包含min函式的棧和兩個棧實現乙個佇列

題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 分析 這是google的一道面試題。看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後push進棧的...

js 包含min函式的棧 包含min函式的棧

目標 定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的 min 函式在該棧中,呼叫 min push 及 pop 的時間複雜度都是 o 1 設計思路 我們要做的是在我們每次資料入棧的時候,記錄當前資料棧中最小值,並且在pop 出棧之後依然能找到最小值 方案 如果只用乙個 min 變數來儲...

包含min函式的棧

題目描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 n代表將要輸入的操作的步驟數。接下來有n行,每行開始有乙個字母ci。ci s 時,接下有乙個數字k,代...