漫画:如何用栈实现队列?
————— 第二天 —————
————————————
栈的特点是先入后出,出入元素都是在同一端(栈顶):
入栈:
出栈:
队列的特点是先入先出,出入元素是在不同的两端(队头和队尾):
入队:
出队:
既然我们拥有两个栈,那么我们可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老元素。
队列的主要操作无非有两个:入队和出队。
在模拟入队操作时,每一个新元素都被压入到栈 A 当中。
让元素 1 “入队”:
让元素 2 “入队”:
让元素 3 “入队”:
这时候,我们希望最先“入队”的元素 1 “出队”,需要怎么做呢?
让栈 A 中的所有元素按顺序出栈,再按照出栈顺序压入栈 B。这样一来,元素从栈 A 弹出并压入栈 B 的顺序是 3,2,1,和当初进入栈 A 的顺序 1,2,3 是相反的:
此时让元素 1 “出队”,也就是让元素 1 从栈 B 弹出:
让元素 2 “出队”:
让元素 4 “入队”:
此时的出队操作仍然从栈 B 弹出元素。
让元素 3 “出队”:
让元素 4 “出队”:
private Stack< Integer> stackA = new Stack< Integer>();
private Stack< Integer> stackB = new Stack< Integer>();
/**
* 入队操作
* @param element 入队的元素
*/
public void enQueue(int element) {
stackA.push(element);
}
/**
* 出队操作
*/
public Integer deQueue() {
if(stackB.isEmpty()){
if(stackA.isEmpty()){
return null;
}
transfer();
}
return stackB.pop();
}
/**
* 栈A元素转移到栈B
*/
private void transfer(){
while (!stackA.isEmpty()){
stackB.push(stackA.pop());
}
}
public static void main(String[] args) throws Exception {
StackQueue stackQueue = new StackQueue();
stackQueue.enQueue(1);
stackQueue.enQueue(2);
stackQueue.enQueue(3);
System.out.println(stackQueue.deQueue());
System.out.println(stackQueue.deQueue());
stackQueue.enQueue(4);
System.out.println(stackQueue.deQueue());
System.out.println(stackQueue.deQueue());
}
声明:本文为作者投稿,首发于个人公众号程序员小灰,版权归其所有。
热 文 推 荐
print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!");
cout < < "点个好看吧!" < < endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
点击“阅读原文”,打开 CSDN App 阅读更贴心!

关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- 1 总书记两会金句 7918667
- 2 巴基斯坦火车遭劫持 超450人成人质 7900687
- 3 菲前总统杜特尔特被逮捕 中方表态 7899664
- 4 从两会看外资“大礼包” 7796549
- 5 网红模仿歌手杨坤被起诉:天塌了 7691087
- 6 大爷开小米SU7 Ultra引围观 7568475
- 7 爸爸带娃一年前后表现判若两人 7468849
- 8 金价大跌创一周新低 7364916
- 9 杜特尔特已被带往荷兰海牙 7268742
- 10 外国青年两会探寻“中国发展密码” 7132251