栈和队列的实现(Java篇)

这篇具有很好参考价值的文章主要介绍了栈和队列的实现(Java篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、栈的概念

栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
栈和队列的实现(Java篇),java,开发语言,数据结构
出栈:栈的删除操作叫做出栈。出数据在栈顶
栈和队列的实现(Java篇),java,开发语言,数据结构

二、栈的实现

栈是一个特殊的顺序表,所以采用链表和数组的方式都可实现,但是,一般采用数组的方式实现

创建一个类:

	public class MyStack {
	//创建一个数组
    public int[] elem;
    //存放的元素个数
    public int usedSize;
    //默认的容量
    public static final int DEFAULT_CAPACITY = 5;
    public MyStack() {
        this.elem = new int[DEFAULT_CAPACITY];
    }
}    

2.1压栈(push)

在入栈之前我们要判断栈是否满了,如果满了就要进行扩容

public boolean isFull() {
    return usedSize == elem.length;
}    
public void push(int val) {
    //判断
    if(isFull()) {
        elem = Arrays.copyOf(elem,2*elem.length);
    }
    elem[usedSize] = val;
    usedSize++;
}  

2.2出栈(pop)

同样在出栈的时候我们也要判断栈是否为空,为空就抛一个异常

public int pop() {
    //判断
    if(isEmpty()) {
        throw new EmptyStackException("栈为空");
    }
    int ret = elem[usedSize-1];
    usedSize--;
    return ret;
}    

2.3获取栈顶元素(peek)

在获取栈顶元素时也要判断栈是否为空

public int peek() {
    //判断
    if (isEmpty()) {
        throw new EmptyStackException("栈为空");
    }
    return elem[usedSize-1];
}    

2.4判断栈是否为空(isEmpty)

public boolean isEmpty() {
    return usedSize == 0;
}    

栈的实现测试

public class Test {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(12);
        myStack.push(23);
        myStack.push(34);
        myStack.push(45);//压栈
        int ret = myStack.pop();//出栈
        System.out.println(ret);
        System.out.println("*****");
        int num = myStack.peek();//获取栈顶元素
        System.out.println(num);
        System.out.println("*****");
        System.out.println(myStack.isEmpty());//判断栈是否为空
    }
}

栈和队列的实现(Java篇),java,开发语言,数据结构

三、队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)
栈和队列的实现(Java篇),java,开发语言,数据结构

四、队列的实现

要想实现一个队列,可以采用链表和数组两种存储数据的方式,那么到底应该用哪种方式实现
对于数组来说,入队列和出队列操作都相对简单,但是可能会造成空间大量浪费,那么我们就可以选择使用链表来实现

创建一个类:

public class MyQueue {
    static class ListNode{
        public int val;
        public ListNode prev;
        public ListNode next;
        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
    public ListNode last;
}

4.1入队(offer)

因为是链表所以在入队时不用考虑扩容的问题,代码执行时动态分配空间

public void offer(int val) {
    ListNode node = new ListNode(val);
    if(head == null) {
        head = last = node;
    }else {
    last.next = node;
    node.prev = last;
    last = node;
    }
}    

4.2出队(poll)

出队时要判断队头是否为空

public int poll() {
    //判断
    if(head == null) {
        return -1;
    }
    int val = -1;
    if(head.next == null) {
        val = head.val;
        head = null;
        last = null;
        return val;
    }
    val = head.val;
    head = head.next;
    head.prev = null;
    return val;
}    

4.3判断队列是否为空

 public boolean empty() {
     return head == null;
}    

4.4获取对头元素

public int peek() {
    if(head == null) {
        return -1;
    }
    return head.val;
}    

队列的实现测试

public class Test {
    public static void main(String[] args) {
        MyQueue queue = new MyQueue();
        queue.offer(12);
        queue.offer(23);
        queue.offer(34);
        queue.offer(45);//入队
        int ret = queue.poll();//出队
        System.out.println(ret);
        System.out.println("*****");
        System.out.println(queue.empty());//判断队列是否为空
        System.out.println("*****");
        int num = queue.peek();//获取队头元素
        System.out.println(num);
    }
}    

栈和队列的实现(Java篇),java,开发语言,数据结构

五、循环队列

实际中我们有时还会使用一种队列叫循环队列,循环队列通常使用数组实现。
利用数组实现一个队列可能会浪费大量的空间,那么,就可以使用循环队列,也能解决资源浪费的问题.
栈和队列的实现(Java篇),java,开发语言,数据结构
循环队列其本质也是一个数组
栈和队列的实现(Java篇),java,开发语言,数据结构
那我们如何区分空与满呢
1.通过添加 size 属性记录
2.保留一个位置
3.使用标记

这里我们使用第二种方式
栈和队列的实现(Java篇),java,开发语言,数据结构

5.1入队

因为是使用数组来实现的,所以在入队之前我们要判断队列是否满了

public boolean isFull() {
    return (rear+1)% elem.length == front;
}    

入队操作

public boolean enQueue(int value) {
    //判断
    if (isFull()) {
        elem = Arrays.copyOf(elem,2*elem.length);
    }
    elem[rear] = value;
    rear = (rear+1)%elem.length;
    return true;
}    

5.2出队

在进行出队操作时要判断队列是否为空

public boolean deQueue() {
    if (isEmpty()) {
        return false;
    }
    front = (front+1)%elem.length;
    return true;
}    

5.3获取队头元素

public int Front() {
    if (isEmpty()) {
        return -1;
    }
    return elem[front];
}    

5.4获取队尾元素

 public int Rear() {
     if (isEmpty()) {
         return -1;
     }
     return elem[rear];
}    

5.5判断队列是否为空

front和rear相遇了就为空

public boolean isEmpty() {
    return front == rear;
}    

六、双端队列

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队
栈和队列的实现(Java篇),java,开发语言,数据结构
Deque是一个接口,使用时必须创建LinkedList的对象
Deque接口比较多,栈和队列都可以使用该接口文章来源地址https://www.toymoban.com/news/detail-768412.html

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

到了这里,关于栈和队列的实现(Java篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(C语言实现)——栈和队列的介绍及基本操作的实现(动态顺序栈+链队)

    今天我们来学习另外两个线性结构——栈和队列,栈和队列是操作受限的线性表,因此,可称为限定性的数据结构。 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守

    2023年04月19日
    浏览(44)
  • 【C语言】数据结构——栈和队列实例探究

    💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 我们在前面学习了单链表和顺序表,今天我们来学习栈和队列。 栈和队列相对于单链表和顺序表来说是较为简单的,之后我们再深入学习双链表。关注博主或是订阅专栏,掌握第一消息。 栈

    2024年02月05日
    浏览(46)
  • C语言数据结构——线性表之栈和队列

    为什么会定义栈和队列这两种数据结构呢? 原因在于: 之所以会定义栈和队列这样的数据结构 是因为他们有两大特性 : 第一: 他们可以保存程序运行路径中各个点的信息,以便用于回溯操作或其他需要访问已经访问过的节点信息的操作。 比如: 栈用于解决迷宫问题,就

    2023年04月11日
    浏览(113)
  • 数据结构|栈和队列以及实现

    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和数据删除的一端称为栈顶,另一端称为栈顶。 栈中的数据元素遵循后进先出的原则,简称LIFO(Last In First Out)。 压栈:栈的插入操作叫做进栈/压栈/入栈, 入数据在栈顶 。 出栈:栈

    2024年02月09日
    浏览(45)
  • 【数据结构】实现栈和队列

    (1)栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底 。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈, 入数据在栈顶。 出

    2024年02月11日
    浏览(44)
  • 【数据结构】栈和队列的模拟实现

    前言:前面我们学习了单链表并且模拟了它的实现,今天我们来进一步学习,来学习栈和队列吧!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印! 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:数据结构 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关

    2024年02月05日
    浏览(49)
  • c++实现数据结构栈和队列

    1、栈 头文件 源文件 主函数 2、循环队列 头文件 源文件 主函数 3、思维导图

    2024年02月08日
    浏览(40)
  • 数据结构基础5:栈和队列的实现。

    1.基本概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈

    2024年02月13日
    浏览(39)
  • 数据结构上机实验——栈和队列的实现、栈和队列的应用、进制转换、约瑟夫环问题

      1.利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。   2.利用循环队列实现.约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人出圈;他的下一个人又从1开始报数,数到k的那个人出圈;依

    2024年02月08日
    浏览(42)
  • 【数据结构】栈和队列的模拟实现(两个方式实现)

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        这一篇博客将学习栈和队列的相关知识, 栈

    2024年02月05日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包