剑指Offer面试题7用两个栈实现队列(附带用两个队列实现栈)
2017-03-02 18:05
381 查看
面试题7:用两个栈实现队列
完成两个函数appendTail和deletedHead,分别是在队列尾部插入节点和在队列头部删除节点的功能。思路:添加元素即压入一个栈s1,删除元素的话,把s1中的元素按顺序先弹出再压入栈s2中,这是弹出栈s2的元素就能实现先进先出了。
相关题:用两个队列实现栈。
思路:添加元素即向一个队列q1添加元素,删除元素的话,把q1的元素按顺序出队然后入队到q2,最后q1剩下一个元素,就是要出栈的元素,再添加元素的话,向非空的队列添加。
用两个栈实现队列的Java实现:
public class CQueue {private Stack<Integer> stack1 = new Stack<>();
private Stack<Integer> stack2 = new Stack<>();
public void appendTail(int elem){
//添加元素就直接向stack1添加
stack1.push(elem);
System.out.println("stack1:" + stack1.toString());
}
public void deleteHead(){
//删除分三种情况:1,stack2不空,直接从它里头弹出。2,stack2空,stack1不空,把1中先弹再压到2,再从2弹出。3,两都空。
if(!stack2.isEmpty()){
stack2.pop();
}else if(!stack1.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
stack2.pop();
}else{
System.out.println("两个栈都空了");
}
System.out.println("stack1:" + stack1.toString());
System.out.println("stack2:" + stack2.toString());
}
public static void main(String[] args) {
CQueue test = new CQueue();
test.appendTail(1);
test.appendTail(2);
test.appendTail(3);
test.deleteHead();
test.deleteHead();
test.appendTail(4);
test.deleteHead();
}
}
用两个队列实现栈的Java实现:
import java.util.Queue;import java.util.LinkedList;
//以下是相关题,两个队列实现栈。
public class CStack {
//是LinkedList类实现了Queue接口
private static Queue<Integer> queue1 = new LinkedList<>();
private static Queue<Integer> queue2 = new LinkedList<>();
private void appendTail(int elem){
//Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。
//它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。
//如果要使用前端而不移出该元素,使用element()或者peek()方法。
//这里是向非空的队列里添加值。都为空的话向队列1添加。
if(!queue2.isEmpty()){
queue2.offer(elem);
}else{
queue1.offer(elem);
}
System.out.println("queue1:" + queue1.toString());
System.out.println("queue2:" + queue2.toString());
}
private void deleteHead(){
//一个表示空队列,一个表示非空队列
Queue<Integer> emptyQueue = queue1;
Queue<Integer> notEmptyQueue = queue2;
if(!emptyQueue.isEmpty()){
emptyQueue = queue2;
notEmptyQueue = queue1;
}
//除了非空队列的最后一个元素,别的都按顺序移到空队列
while(notEmptyQueue.size()!=1){
emptyQueue.offer(notEmptyQueue.poll());
}
//删除刚才留下的最后一个元素
notEmptyQueue.poll();
System.out.println("queue1:" + queue1.toString());
System.out.println("queue2:" + queue2.toString());
}
public static void main(String[] args) {
CStack test = new CStack();
test.appendTail(1);
test.appendTail(2);
test.appendTail(3);
test.deleteHead();
test.appendTail(4);
test.deleteHead();
}
}
相关文章推荐
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指Offer:面试题7 用两个栈实现队列
- 【剑指Offer学习】【面试题7:用两个栈实现队列】
- 剑指Offer----面试题七:用两个栈实现队列
- 【剑指offer】面试题七:用两个栈实现队列
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指Offer面试题7用两个栈实现队列
- 剑指offer--面试题7:用两个栈实现队列--Java实现
- 剑指offer--面试题7: 用两个栈实现队列
- 剑指offer面试题7:用两个栈实现队列
- 【剑指Offer面试题】 九度OJ1512:用两个栈实现队列
- 【剑指offer】2.3.5栈和队列——面试题7:用两个栈实现队列
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 【练习笔记】剑指offer-面试题7 :用两个栈实现队列
- 剑指offer 面试题7 两个栈实现队列
- 【剑指offer 面试题7】用两个栈实现队列
- 剑指offer面试题java实现之题7:用两个栈模拟一个队列的入队和出队操作
- 剑指offer之面试题7:用两个栈实现队列
- [剑指offer][面试题07-扩展]用两个队列实现栈
- [剑指offer][面试题07]用两个栈实现队列