剑指Offer面试题:8.用两个栈实现队列
一、题目
————————————————
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
————————————————
二、思路
————————————————
这道题较简单,自己先试着模拟一下插入删除的过程(在草稿纸上动手画一下):插入肯定是往一个栈stack1中一直插入;删除时,直接出栈无法实现队列的先进先出规则,这时需要将元素从stack1出栈,压到另一个栈stack2中,然后再从stack2中出栈就OK了。需要稍微注意的是:当stack2中还有元素,stack1中的元素不能压进来;当stack2中没元素时,stack1中的所有元素都必须压入stack2中。否则顺序就会被打乱。
————————————————
三、解决问题
————————————————
测试用例
1.往空队列添加删除元素
2.往非空队列添加删除元素
3.删除至队列为空
————————————————
package swordoffer;
/**
* @author LQ
* @version 1.0
* @date 2020-03-13 17:09
*/
import java.util.Stack;
/**
* 用两个栈实现一个队列。队列的声明如下
* 请实现它的两个函数appendTail和deleteHead
* 分别完成在队列尾部插入结点和在队列头部删除结点的功能。
*/
public class Solution08 {
public static void main(String[] args) {
System.out.println("==============================");
Solution08 sword = new Solution08();
sword.test1();
System.out.println("==============================");
sword.test2();
System.out.println("==============================");
}
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
/**
* 插入结点
* @param node
*/
public void push(int node) {
stack1.push(node);
}
/**
* 删除结点
* @return
*/
public int pop() {
if(stack2.empty()){
if (stack1.empty()){
throw new RuntimeException("队列为空");
}else{
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
}
return stack2.pop();
}
//=======测试代码==========
public void test1() {
push(1);
push(2);
System.out.println(pop());//1
push(3);
System.out.println(pop());//2
System.out.println(pop());//3
}
/**
* 往空队列删除元素
*/
public void test2() {
System.out.println(pop());
}
}
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。
Java基础 文章被收录于专栏
建立本人的Java基础技术栈积累库
