面試題(判斷元素出棧入棧順序的合法性。)
面試題(實現乙個棧,要求實現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,否則直接彈出棧...