剑指offer面试题7(java实现)

本文介绍如何利用两个栈实现队列的基本操作,并给出具体的Java代码实现。此外,还探讨了如何使用两个队列模拟栈的行为,提供了一种实现栈结构的有效途径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

用两个栈实现一个队列。请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。

思路

先了解一下,栈与队列之间的不同,栈的结构决定它具有“后进先出”的入栈出栈特点,而队列则是有“先进先出”的特点。设想一下,如果对一种数据进行一次入栈操作,紧接着在对第一次入栈的数据进行二次入栈,这样出栈的顺序相对于原数据就可以认为是“先进先出”啦,实现了队列的功能。

这里写图片描述

通过分析,我们总结一下用两个栈实现队列中的两个方法的思路:
1. 插入元素的方法:
先在两个栈中选择一个作为插入栈(其中的数据是原始数据经过一次入栈),另一个则为删除栈(其中的数据是经过二次入栈操作的,可以认为是队列中的数据),然后在插入栈中插入要插入的元素即可。
2. 删除元素的方法:
相对于插入方法,删除元素的方法要复杂一些。
检测一下删除栈中有没有元素,如果有元素的话则直接删除;如果没有数据,需要将插入栈的数据入栈至此删除栈完成二次入栈动作,达成“先进先出”的效果。

代码实现

public class Queue{
    private Stack<String> a;//插入栈
    private Stack<String> b;//删除栈
    public static void main(String[] args) {
    uestion007 queue = new Question007();    
    queue.appendTail("a");
    queue.appendTail("b");
    queue.appendTail("c"); 
    queue.appendTail("d");
    queue.appendTail("e"); 
    while (!queue.isEmpty()) {
          System.out.println(queue.deleteHead()); 
          }
    }
    public Question007() {
        a = new Stack<String>();
        b = new Stack<String>();
    }
    public void appendTail(String string) {
        a.push(string);
    }
    public String deleteHead() {
        if (b.isEmpty()) {
            while (!a.isEmpty()) {
                b.push(a.pop());
            }
        }
        return b.pop();
    }

    public boolean isEmpty() {
        return b.isEmpty() && a.isEmpty();
    }
}

扩展题目

设想一下使用两个队列来实现一个栈的结构。

思路

必须要提的是栈是“后进先出”的结构,而队列是“先进先出”的结构。用两个队列实现一个栈,需要交替使用这两个队列,例如序列为{1,2,3,4},有两个队列a,b.刚开始啊a,b两个队列都是空的,任取一个队列使用,这里选用队列a,将第一个元素插入a,当第二个元素需要插入时,同样需要找一个空的队列,这里只有b,然后将a中的元素移出队列,同时插入b中,这时候b中从头到尾的元素为2,1.接下来第三个元素同样找一个空的队列插入数据,将不空的队列中的元素插入先前找到的空队列。以此类推,每一个过程结束的时候,均有一个空队列(作为下一次插入数据的队列)和一个不空队列(删除数据的队列)。

整个过程如下:

这里写图片描述

代码实现

public class Stack {
    private Queue<String> a;
    private Queue<String> b;

    public Stack () {
        a = new LinkedList<String>();
        b = new LinkedList<String>();
    }
    public void push(String string) {
        if (a.isEmpty() && b.isEmpty()) {
            b.offer(string);//这里选用了b队列
        } else if (a.isEmpty()) {
            a.offer(string);
            while (!b.isEmpty()) {
                a.offer(b.poll());
            }
        } else {
            b.offer(string);
            while (!a.isEmpty()) {
                b.offer(a.poll());
            }
        }
    }

    public String pop() {
        if (a.isEmpty() && b.isEmpty()) {
            return null;
        } else if (!a.isEmpty()) {
            return a.poll();
        } else {
            return b.poll();
        }
    }

    public boolean isEmpty() {
        return a.isEmpty() && b.isEmpty();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值