数据结构 | 再也不怕被问栈跟队列了

简介: 数据结构 | 再也不怕被问栈跟队列了

栈:


概念:


百度百科:


栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


简单来说,栈就是一种先进后出的数据结构,图示如下

image.png


栈的实现:


1.数组

package com.study.spring.transaction.stack;
import lombok.Getter;
import lombok.Setter;
/**
 * @author dmz
 * @date Create in 23:44 2019/8/12
 */
@Getter
@Setter
public class ArrayStack<T> {
    public ArrayStack(int size) {
        this.size = size;
        this.array = new Object[size];
    }
    // 初始化的大小
    private int size;
    private Object[] array;
    // 下一次要放入的元素的位置
    private int currentIndex;
    public void push(T t) {
        if (currentIndex == size) {
            throw new RuntimeException("栈中元素已满");
        }
        array[currentIndex++] = t;
    }
    public T pop() {
        if (currentIndex == 0) {
            throw new RuntimeException("栈中已经没有元素啦");
        }
        Object o = array[--currentIndex];
        return (T) o;
    }
}
package com.study.spring.transaction.stack;
/**
 * @author dmz
 * @date Create in 23:43 2019/8/12
 */
public class StackDemo {
    public static void main(String[] args) {
        ArrayStack<Integer> arrayStack = new ArrayStack<>(5);
        arrayStack.push(1);
        arrayStack.push(2);
        arrayStack.push(3);
        arrayStack.push(4);
        arrayStack.push(5);
        System.out.println(arrayStack.pop());
        System.out.println(arrayStack.pop());
        System.out.println(arrayStack.pop());
        System.out.println(arrayStack.pop());
        System.out.println(arrayStack.pop());
    }
}

运行结果就不贴了,大家可以自行运行测试

2.链表

package com.study.spring.transaction.stack;
import lombok.Getter;
import lombok.Setter;
import java.util.LinkedList;
/**
 * @author dmz
 * @date Create in 0:01 2019/8/13
 */
@Getter
@Setter
public class LinkStack<T> {
    // 最大容量
    private int size;
    // 存储数据的链表
    private LinkedList<T> linkedList;
    public LinkStack(int size) {
        this.size = size;
        this.linkedList = new LinkedList<T>();
    }
    public void push(T t) {
        if (linkedList.size() < size) {
            linkedList.add(t);
        } else {
            throw new RuntimeException("栈中元素已满");
        }
    }
    public T pop() {
        if (linkedList.size() == 0) {
            throw new RuntimeException("栈中已经没有元素啦");
        }
        return linkedList.removeLast();
    }
}

大家可以按照数组的方式自行测试。其实JDK中的LinkedList本身就已经实现了栈这种数据结构。大家可以直接查找LinkedList中的push以及pop方法

image.png

队列:


概念:


队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。


简单来说,队列就是一种先进先出的数据结构,如下图所示:

image.png


队列的实现:


1.数组

package com.study.spring.transaction.queue;
import lombok.Data;
/**
 * @author dmz
 * @date Create in 0:25 2019/8/13
 */
@Data
public class ArrayQueue<T> {
    private int size;
    private Object[] objects;
    // 下个加入的元素的下标
    private int currentIndex;
    public ArrayQueue(int size) {
        this.size = size;
        currentIndex = size - 1;
        objects = new Object[size];
    }
    public void offer(T t) {
        if (currentIndex < 0) {
            throw new RuntimeException("队列中元素已满");
        }
        objects[currentIndex--] = t;
    }
    public T peek() {
        if (0 == size) {
            throw new RuntimeException("队列中已经没有元素啦");
        }
        return (T) objects[--size];
    }
}
/**
 * @author dmz
 * @date Create in 0:25 2019/8/13
 */
public class QueueDemo {
    public static void main(String[] args) {
        ArrayQueue<Integer> arrayQueue = new ArrayQueue<>(5);
        arrayQueue.offer(5);
        arrayQueue.offer(4);
        arrayQueue.offer(3);
        arrayQueue.offer(2);
        arrayQueue.offer(1);
        System.out.println(arrayQueue.peek());
        System.out.println(arrayQueue.peek());
        System.out.println(arrayQueue.peek());
        System.out.println(arrayQueue.peek());
        System.out.println(arrayQueue.peek());
        System.out.println(arrayQueue.peek());
    }
}

2.链表

package com.study.spring.transaction.queue;
import lombok.Data;
import java.util.LinkedList;
/**
 * @author dmz
 * @date Create in 0:25 2019/8/13
 */
@Data
public class LinkQueue<T> {
    private int size;
    private LinkedList<T> linkedList;
    public LinkQueue(int size) {
        this.size = size;
        linkedList = new LinkedList<>();
    }
    public void offer(T t) {
        if (size == linkedList.size()) {
            throw new RuntimeException("队列中元素已满");
        }
        linkedList.addLast(t);
    }
    public T peek() {
        if (size == 0) {
            throw new RuntimeException("队列中已经没有元素啦");
        }
        return linkedList.removeLast();
    }
}

关于链表的实现我也不验证了,大家可以参考之前的示例进行验证。


为什么需要队列跟栈这些数据结构?


通过 上面的例子已经讲解不知道大家有没有这个疑惑?既然栈跟队列可以通过数组或链表实现,它们其实就是一个受限的数组或链表。相比于数组跟链表,栈跟队列这种数据结构带来的更多不过是限制罢了,那么为什么我们还需要它们呢?事实上,从功能上来看,数组跟链表确实能完全提代这两种数据结构,但是我们要知道的是,特点的数据结构是对特定场景的抽象,而且数组跟链表暴露了过多的操作接口,虽然操作上更加灵活,但是使用时就更加不可控,更容易出错。


相关文章
|
19天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
100 9
|
10天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
19 1
|
13天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
16天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
18天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
46 4
|
22天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
数据结构(栈与列队)
数据结构(栈与列队)
20 1
|
1月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
71 1
|
1月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
17 0
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
31 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器

热门文章

最新文章