栈是常见的数据结构,比如说操作系统会给每个线程创建一个栈用来存储函数调用时的各个函数的参数,返回地址及临时变量;
栈的特点是先进后出(FILO),栈不考虑排序,需要O(n)找到最大或者最小的数;
队列的特点是先进先出,即第一个进入队列的元素将会第一个出来。
题目8:用两个栈实现队列
题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
解题思路:
- 队列是需要先进先出,而栈是先进后出,
- 在一个stack1中依次压入put()-> {a、b、c},此时栈顶为最后压入的c,栈底为a,
- 若中间再用一个stack2,将从stack1中弹出pop()->{c,b,a}依次压入Stack2,此时stack2中元素放入的位置与stack1相反
- stack2{a,b,c},再将Stack2中的元素弹出后则为a,b,c实现了队列的功能。
- 当stack2不为空的时候,在stack2中的栈顶元素是最先进入队列的元素,可以弹出,当stack2为空时,把stack1中的元素逐个弹出并且压入stack2,由于先进入队列的元素 被压到stack1底端,经过弹出和压入操作后就处于Stack2的顶端,可以直接弹出。
代码实现:
package swordToOffer;
import java.util.Stack;
public class Num8_StackToQueue {
static class Queue{
Stack<Object> stack1 = new Stack<Object>();
Stack<Object> stack2 = new Stack<Object>();
public void push(Object node) {
stack1.push(node);
}
public Object pop() {
if(stack2.empty()) {
if(stack1.empty()) {
throw new RuntimeException("null queue!");
}else {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
}
return stack2.pop();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Queue queue1 = new Queue();
queue1.push(1);
queue1.push(2);
queue1.push("a");
System.out.println(queue1.pop());
queue1.push("/");
System.out.println(queue1.pop());
System.out.println(queue1.pop());
Queue queue2 = new Queue();
System.out.println(queue2.pop());
}
}
题目考点:
- 队列是先进先出(FIFO) ----排队吃饭
- 栈是进后出(FILO)----装羽毛球的球桶
- 通过画图将抽象问题形象化。
输出结果:
Exception in thread "main"
1
2
a
java.lang.RuntimeException: null queue!