劍指offer5-用兩個棧實現隊列
最近全國疫情嚴重,待在家裏沒事幹,馬上又要準備春招了,最近刷刷題,記錄一下!再說一句,武漢加油,大家出門記得戴口罩!
1、題目描述
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。
2、思路分析
本題的基本意圖是:用兩個後入先出的棧來實現先入先出的隊列。
對於這個問題,我們可以通過一個實例來進行具體分析。不難得出相應的規律:有兩個棧stack1和stack2,每次向隊列中插入元素可以都壓入到stack1中,當需要從隊列中刪除元素時,我們應該是刪除最早插入的那個(FIFO),這時可以將stack1中的元素逐個彈出並壓入stack2,直到stack1爲空,這時最早插入的元素就位於stack2的棧頂,可以直接彈出。
因此,我們總結如下:壓入元素時,都壓入棧1,當需要彈出時,從棧2彈出,當棧2不爲空時直接彈出棧頂元素,爲空時將棧1的元素“倒進去”。
3、代碼
package com.jianzhioffer;
import java.util.Stack;
public class Main05 {
//棧 先進後出
//隊列 先進先出
//push 操作在棧1裏面完成 pop操作在棧2裏面完成
/*
方法一:通過兩個棧中元素之間的複製交換去實現隊列
*/
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
while(!stack2.isEmpty()) {
stack1.push(stack2.pop()); //將棧2中的元素加入到棧1中
}
stack1.push(node);
}
public int pop() {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop()); //將棧1中的元素加入到棧2中
}
return stack2.pop();
}
}