美文网首页
Java中两种方法实现栈和队列(面试)

Java中两种方法实现栈和队列(面试)

作者: Aunero | 来源:发表于2020-06-21 11:45 被阅读0次

学到LinkedList,上课时老师提了一下代码实现栈和队列,面试可能会用上,就码了栈和队列两种实现方案。如有问题,希望指出。

一、栈

1.数组实现栈

/*
    利用数组的方式实现一个栈
    栈的特点:  存储数据 -- 先进后出(就像弹夹)
    定义一个栈类:
    成员变量:
    1.存储数据的数组
    2.栈容量
    3.栈顶索引
    成员方法:
    1.压入数据方法
    2.取出数据方法

 */
public class Stack {

    private int[] data;
    private int size;
    private int stackTop = -1;  //记录栈顶索引, 默认空, 索引-1

    //构造方法
    public Stack(int size) {
        this.size = size;
        this.data = new int[size];
    }

    public boolean push(int data) {     //压栈方法
        if (stackTop + 1 == size) {
            System.out.println("栈已满");
            return false;
        }
        this.data[++stackTop] = data;       //栈顶默认值为-1,所以要先加后充当索引
        return true;
    }

    public int pop() throws Exception {   //出栈方法
        if (stackTop == -1) {
            throw new Exception("栈已空");
        }
        return data[stackTop--];    //返回数据后栈顶后移
    }
}

class StackDemo {
    public static void main(String[] args) throws Exception {

        Stack s = new Stack(5);
        //s.pop();  //报栈空

        //压栈
        for (int i = 1; i <= 5; i++) {
            System.out.println(s.push(i));
        }
        //s.push(6);    //报栈满

        //出栈
        for (int i = 0; i < 5; i++) {
            System.out.println(s.pop());
        }

    }
}

2.LinkedList实现栈

import java.util.LinkedList;

/*
    使用 LinkedList类 实现栈
    LinkedList类: 底层是链表  特点: 查询慢, 增删快

     特有功能:
     public void addFirst(E e): 在该列表开头插入指定元素
     public void addLast(E e):  将指定元素追加到此列表的末尾

     public E getFirst():   返回此列表中的第一个元素
     public E getLast():    返回此列表中的最后一个元素

     public E removeFirst(): 从此列表中删除并返回第一个元素
     public E removeLast():  从此列表中删除并返回最后一个元素
 */
public class Stack {
    private LinkedList<Integer> list = new LinkedList<>();
    private int size;   //栈的大小

    //构造方法
    public Stack(int size) {
        this.size = size;
    }

    //压栈方法
    public boolean push(int data) {
        if (list.size() == size) {
            System.out.println("栈已满");
            return false;
        }
        list.addLast(data); //直接使用LinkedList的方法往后添加元素
        return true;
    }

    //出栈方法
    public int pop() throws Exception {
        if (list.size() == 0) {
            throw new Exception("栈已空");
        }
        return list.removeLast();   //删除并返回最后一个元素
    }
}

class StackDemo {
    public static void main(String[] args) throws Exception {
        Stack s = new Stack(5);

        //s.pop();    //报栈空
        //压栈
        for (int i = 1; i <= 5; i++) {
            s.push(i);
        }

        //s.push(6);  //报栈满

        //出栈
        for (int i = 0; i < 5; i++) {
            System.out.println(s.pop());
        }
        //s.pop();    //报栈空
    }
}

二、队列

1.数组实现队列

/*
    数组实现队列
    队列的特点:  存储数据 -- 先进先出(排队)
    定义一个队列类:
    成员变量:
    1.存储数据的数组
    2.队列容量
    3.队列头部索引
    4.队列尾部索引
    成员方法:
    1.加入数据方法
    2.取出数据方法
 */
public class Queue {
    private int[] data;
    private int size;
    private int queueLast = -1;     //队列头索引
    private int queueFirst = -1;    //队列尾索引

    //构造方法
    public Queue(int size) {
        this.size = size;
        this.data = new int[size];
    }

    //入列
    public boolean inQueue(int data) {
        if (queueLast + 1 == size) {
            System.out.println("队列已满");
            return false;
        }
        this.data[++queueLast] = data;
        return true;
    }

    //出列
    public int outQueue() throws Exception {
        if (queueFirst == queueLast) {
            throw new Exception("队列已空");
        }
        return data[++queueFirst];
    }
}

class QueueDemo {
    public static void main(String[] args) throws Exception {
        Queue q = new Queue(5);

        //q.outQueue();     //报队列空
        for (int i = 1; i <= 5; i++) {
            q.inQueue(i);
        }

        //q.inQueue(6);   //报队列满

        for (int i = 0; i < 5; i++) {
            System.out.println(q.outQueue());
        }

        //q.outQueue();   //报队列空
    }
}

2.LinkedList实现队列

import java.util.LinkedList;

/*
    LinkedList实现队列
 */
public class Queue {
    private LinkedList<Integer> list = new LinkedList<>();
    private int size;

    //构造方法
    public Queue(int size) {
        this.size = size;
    }

    //入队列方法
    public boolean inQueue(int data) {
        if (list.size() == size) {
            System.out.println("队列已满");
            return false;
        }
        list.addLast(data);    //从头添加元素
        return true;
    }

    //出队列方法
    public int outQueue() throws Exception {
        if (list.size() == 0) {
            throw new Exception("队列已空");
        }
        return list.removeFirst();  //从头删除元素并返回元素
    }

}

class QueueDemo {
    public static void main(String[] args) throws Exception {
        Queue q = new Queue(5);

        //q.outQueue();   //报队列空

        for (int i = 1; i <= 5; i++) {
            q.inQueue(i);
        }

        //q.inQueue(6);   //报队列满

        for (int i = 0; i < 5; i++) {
            System.out.println(q.outQueue());
        }

        //q.outQueue();       //报队列空
    }
}


相关文章

  • Java中两种方法实现栈和队列(面试)

    学到LinkedList,上课时老师提了一下代码实现栈和队列,面试可能会用上,就码了栈和队列两种实现方案。如有问题...

  • 用两个栈实现队列,用两个队列实现堆栈

    参考:剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈 用两个栈实现队列stack1作为入...

  • Java 使用栈实现简单队列功能

    Java 使用栈实现简单队列功能 前两天面试奇安信,有问到如果通过栈实现队列,当时没有回答清楚,现在记录一下。 ...

  • 连个栈实现一个队列

    用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 语言java 用两个栈实现一...

  • 剑指offer第二版-9.用两个栈实现队列

    本系列导航:剑指offer(第二版)java实现导航帖 面试题9:用两个栈实现队列 题目要求:用两个栈,实现队列的...

  • 队列 - Queue

    基本概念 队列和栈类似,不同的是,先进队列的元素,最先从队列出去。 实现 通过链表实现队列 Java中,队列是一个...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 05用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 Java实现

  • 两个栈实现一个队列

    《剑指offer》面试题9:两个栈实现队列 题目:用2个栈实现一个队列,完成队列的push和pop操作 思路:栈1...

  • 栈和队列 学习总结 (一)栈

    栈和队列 学习总结 (一)栈 概述: 栈和队列是两种特殊的线性表,特殊之处在于插入和删除操...

网友评论

      本文标题:Java中两种方法实现栈和队列(面试)

      本文链接:https://www.haomeiwen.com/subject/eewoxktx.html