高頻面試題之三種方法實現兩個棧實現乙個佇列

2021-07-12 04:16:05 字數 2131 閱讀 4202

高頻面試題*

兩個棧實現乙個佇列:

談到棧實現佇列首先我們必須了解棧和佇列的特點:

棧:只允許在棧頂插入和刪除。

佇列:插入在對尾操作,刪除在對頭操作.

兩個棧實現乙個佇列:

(ps:這道題對程式設計者或面試者的要求:

1.在短時間內,能不能找到解決這道題的足夠清晰的思路(思維是否敏捷、清晰)。

2.能不能在單向表述中,清楚地描述自己的思路和想法(表述能力是否達到要求)。

3.對於某些具體細節,能不能考慮到(是否足夠細緻)。

方法一:入隊時直接把元素push到s1,出隊時把s1倒入s2,pop掉s2棧頂元素,再倒回到s1.

**實現:

(ps:這裡出隊時當s1,s2都為空的時候採用了丟擲異常的方法,方法二和方法三都是首先用if做出了判斷)

#includeusing namespace std;

#includetemplateclass queue

void pop()

while (s1.empty())

s2.pop();

while (s2.empty())

void print1()

cout << "queue: ";

while (!s1.empty())

cout << endl;

} }private:

stacks1;

stacks2;

};

方法二:入隊:s1不為空時,直接把元素壓入s1,s1為空時,把s2倒入s1,再把元素壓入s1.

出隊:s2不為空時,直接彈出s2棧頂的元素,s2為空時,先把s1倒入s2,再彈出s2棧頂的元素。

**實現:

template class queue

else

s1.push(x);

} }void pop()

else if (s2.empty())

s2.pop();

} else if (s1.empty() && s2.empty())

catch (int)

}} void print1()

cout << "queue: ";

while (!s1.empty())

cout << endl;

}private:

stacks1;

stacks2;

};

方法三:入隊時直接把元素壓入s1;

出隊時如果s2不為空,直接彈出s2棧頂元素,如果s2為空,把s1倒入s2,再彈出s2棧頂元素。

**實現:

templateclass queue

void pop()

;

測試用例:

void queuetest1()

//void queuetest2()

//

主函式:

int main()

總結:棧和佇列各有自己的特點,棧適合用陣列結構即順序表結構實現,而佇列適合用鍊錶結構實現,就棧和佇列本身而言不但可以相互實現,而且在資料結構中有舉足輕重的作用,二叉樹的遍歷就要用到棧和佇列。本文呼叫的都是系統的棧,棧的實現就不多在這描述了。值得注意的是棧和佇列各自的特點以及棧和佇列不同操作所在的位置。文章前面都已悉數提到。

面試題 兩個佇列實現棧

兩個佇列實現棧 前提已知 typedef struct queue queue void initqueue queue q void enqueue queue q,int key int dequeue queue q int sizeofqueue queue q int isqueueemp...

面試題7 兩個棧實現佇列

已知下面stack類及其3個方法push pop和 count,請用2個stack實現queue類的入隊 enqueue 出隊 dequeue 方法。class stack class queue 這道題應該不算難,比起 程式設計之美 中微軟那些什麼 翻烙餅 的面試題,難度上差遠了。況且,由於時間關...

面試題之 用兩個棧實現佇列

題目很簡單,與之相似的還有用兩個佇列實現棧,思路類似都是用乙個村乙個倒,類似負負得正嘛。具體分析一下兩個棧實現佇列,設這兩個分別為s1和s2,我們從入隊開始,最開始只要直接壓倒s1中,然後出隊,此事要先將元素全部彈到出再放到s2中 現在的問題是當兩個棧都有東西的時候要怎麼處理,其實分析一下我們發現s...