队列化栈栈化队列(力扣)
用隊(duì)列實(shí)現(xiàn)棧
請(qǐng)你僅使用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)后入先出(LIFO)的棧,并支持普通隊(duì)列的全部四種操作(push、top、pop 和 empty)。
實(shí)現(xiàn) MyStack 類:
void push(int x) 將元素 x 壓入棧頂。
int pop() 移除并返回棧頂元素。
int top() 返回棧頂元素。
boolean empty() 如果棧是空的,返回 true ;否則,返回 false 。
注意:
你只能使用隊(duì)列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 這些操作。
你所使用的語言也許不支持隊(duì)列。 你可以使用 list (列表)或者 deque(雙端隊(duì)列)來模擬一個(gè)隊(duì)列 , 只要是標(biāo)準(zhǔn)的隊(duì)列操作即可。
這道題的關(guān)鍵之處就是push的操作,如何可以讓后入隊(duì)的數(shù)據(jù)成為隊(duì)頭呢?
隊(duì)列化棧有兩種辦法:
1,兩個(gè)隊(duì)列
隊(duì)列是先進(jìn)先出,而棧則是先進(jìn)后出,可以設(shè)兩個(gè)隊(duì)列q1和q2,q2作為一個(gè)輔助隊(duì)列,每次進(jìn)棧元素先入隊(duì)到q2中,這就是棧頂,然后在依次將q1中的元素依次入隊(duì)到q2中,則q2的數(shù)據(jù)就是棧的存儲(chǔ)方式,然后再交換q1和q2,當(dāng)再有新的數(shù)據(jù)入棧時(shí)再重復(fù)這幾步;代碼如下:
2,一個(gè)隊(duì)列
想法是類似的,只要有新數(shù)據(jù)入隊(duì),只需要把該數(shù)據(jù)之前的所有數(shù)據(jù)移到該數(shù)據(jù)之后就可以了;
代碼如下:
棧化隊(duì)列
實(shí)現(xiàn)一個(gè)MyQueue類,該類用兩個(gè)棧來實(shí)現(xiàn)一個(gè)隊(duì)列。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
說明:
你只能使用標(biāo)準(zhǔn)的棧操作 – 也就是只有 push to top, peek/pop from top, size 和 is empty 操作是合法的。
你所使用的語言也許不支持棧。你可以使用 list 或者 deque(雙端隊(duì)列)來模擬一個(gè)棧,只要是標(biāo)準(zhǔn)的棧操作即可。
假設(shè)所有操作都是有效的 (例如,一個(gè)空的隊(duì)列不會(huì)調(diào)用 pop 或者 peek 操作)。
兩個(gè)棧實(shí)現(xiàn)
我們可以通過兩個(gè)棧來實(shí)現(xiàn)隊(duì)列先進(jìn)先出,設(shè)棧s1和s2,先將數(shù)據(jù)入棧到s1中,s1的數(shù)據(jù)再依次出棧到s2中,這樣s1的棧頂就成了s2的棧底,而s1中最先入棧的數(shù)據(jù)就成了s2的棧頂,這樣就實(shí)現(xiàn)了先進(jìn)先出;
總的來說就是s1只用來入棧,而s2只用來出棧,即s1執(zhí)行的入隊(duì)操作,s2是出隊(duì)操作;
代碼如下:
總結(jié):這兩道題雖然是棧和隊(duì)列的互換,但是細(xì)細(xì)體會(huì)就會(huì)感受到不同數(shù)據(jù)結(jié)構(gòu)之間的聯(lián)系,對(duì)數(shù)據(jù)的處理方式還需不斷理解體會(huì);
總結(jié)
以上是生活随笔為你收集整理的队列化栈栈化队列(力扣)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除有序数组中的重复项(数组去重)
- 下一篇: 打印折痕方向(二叉树应用)