面試題(兩個棧實現乙個佇列和兩個佇列實現乙個棧)

2021-08-08 18:06:40 字數 1824 閱讀 7382

面試題(判斷元素出棧入棧順序的合法性。)

面試題(實現乙個棧,要求實現push(出棧)、pop(入棧)、min(返回最小值的操作)的時間複雜度為o(1))

我們知道棧是後進先出的,而佇列是先進先出的

我們建立兩個棧input(輸入棧),output(輸出棧)

我們用input(輸入棧)來負責入隊,而output(輸出棧)來負責出隊(反向)

出隊是,如果output不為空,則先從output中出隊,如果output為空,則需要把input中所有元素壓入output中。

下面是**實現部分

#include

#include

using

namespace

std;

template

class queue

void pop()//刪除隊頭資料

if(output.empty())//如果輸出棧為空

}output.pop();//刪除輸出棧元素(也就是出隊)

}t &front()

if (output.empty())//

return output.top();

}else

}protected:

stack

input;//輸入棧

stack

output;//輸出棧

};void test1()

與兩個棧實現乙個佇列不同的是:這個所建立的佇列是相等地位的,而上面乙個負責入隊,乙個負責出隊。

我們在這裡是建立了兩個佇列分別為q1,q2。

比如在q1中壓棧了1,2,3,4,q2是空的,要出「棧」,實際上要出q1中的最後乙個元素,我們將q1中除最後乙個元素之外的其他元素全部放去q2中(所有元素順序不會改變),這樣在q1中留下的元素就是要pop()的棧頂元素,然後在pop(q1.top())

這裡需要注意的是,無論q1,q2怎麼來回倒,我們要保證有乙個佇列是空的,用空的佇列來臨時存放除隊尾外的所有元素。

先來看一下push():如果q1為空,則在q1中push(),如果q2為空,則在q2中push(),如果兩個都為空,則我們規定在q1中push()。

下面是pop:如果q1不為空,我們將q1中除最後乙個元素之外,都移動到q2中,然後刪除q1中最後乙個元素(也就是刪除棧頂元素),反之同理

**實現

#include

#include

using

namespace

std;

template

class stack

else

if (!q2.empty())//如果q2不為空

else

//q1,q2都為空

}void pop()

q1.pop();//刪除q1中最後乙個元素(也就是刪除棧頂元素)

}else

q2.pop();}}

t top()

return q1.front();

}else

return q2.front();}}

protected:

queue

q1;queue

q2;};void test()

面試題7兩個棧實現乙個佇列和兩個佇列實現乙個棧

兩個棧實現乙個佇列,本質上是用兩個棧去模擬佇列的入隊和出隊。寫程式時無需死記,畫個示意圖推一下就好 stack1,和stack2 去模擬,入隊時只在stack1 中將元素入棧,出隊時只將stack2的棧頂元素出隊,出隊時 1 首先判斷stack2 是否為空,若stack2 為空將則將stack1中的...

兩個棧實現乙個佇列和兩個佇列實現乙個棧

stack 後進先出 lifo 是在表的一端進行插入或刪除運算的線性表,我們把插入 刪除的這一端稱為棧頂 top 另一端稱為棧底 bottom e push e item 把元素壓入棧頂並返回此元素 e pop 移除棧頂元素並返回此元素 e peek 檢視棧頂元素而不移除它 boolean empt...

兩個棧實現乙個佇列和兩個佇列實現乙個棧

棧的特性 先進後出 filo 佇列的特性 先進先出 fifo 1 兩個棧實現乙個佇列 1 思路 入棧時,直接壓入棧1中 如果棧1滿了,判斷棧2是否為空,若為空,則將棧1元素全部倒入棧2,再入棧 若棧2不為空,則不能再入元素 出棧時,判斷棧2是否為空,若棧為空,則將棧1中的元素倒入棧2,否則直接彈出棧...