Java 使用棧實現(xiàn)簡單隊列功能
前兩天面試奇安信殖熟,有問到如果通過棧實現(xiàn)隊列,當時沒有回答清楚叫胁,現(xiàn)在記錄一下凰慈。
通過A,B兩個棧,一個作為入棧驼鹅,一個作為出棧微谓。當有數(shù)據(jù)入列時將數(shù)據(jù)放入A棧,如果需要出列输钩,則調(diào)用B棧進行出棧豺型。
具體實現(xiàn)方案
- 當有數(shù)據(jù)入隊時,使用A棧進行入棧买乃,并判斷B棧是否為空姻氨,如果為空則將A棧的數(shù)據(jù)轉(zhuǎn)移至B棧
- 當出棧時,判斷B棧是否存在數(shù)據(jù)剪验,如果存在直接彈出哼绑,否則轉(zhuǎn)移數(shù)據(jù)
注意:一定是要在B棧為空時進行轉(zhuǎn)移,否則會導致順序錯亂
public class StackQuene {
//用于入棧
private Stack<Integer> statckPush;
// 用于出棧
private Stack<Integer> stackPop;
public StackQuene(){
stackPop = new Stack<>();
statckPush = new Stack<>();
}
public int poll(){
if(stackPop.empty()){
// 當出棧中沒有數(shù)據(jù)碉咆,則進行轉(zhuǎn)移
transferStack();
}
if(stackPop.empty()){
// 數(shù)據(jù)轉(zhuǎn)移后依然沒有數(shù)據(jù)
return -1;
}
return stackPop.pop();
}
public void add(int num){
statckPush.push(num);
// 如果出棧為空抖韩,則進行轉(zhuǎn)移
if(stackPop.empty()){
transferStack();
}
}
/**
* 將入棧數(shù)據(jù)轉(zhuǎn)入到出棧
*/
public void transferStack(){
while (!statckPush.empty()){
stackPop.push(statckPush.pop());
}
}
}