[数据结构]栈和队列

news2025/1/9 19:53:01

目录

  • [数据结构]栈和队列
  • 一.栈
    • 1.栈的基本概念
    • 1.2 栈的常见基本操作
    • 1.3 栈的实现
      • 1.3.1 入栈
      • 1.3.2 出栈
      • 1.3.3获取栈顶元素
      • 1.3.4 判断栈为空
      • 1.3.5 栈实现
  • 二.队列
    • 2.1 入队
    • 2.2 出队
    • 2.3 获取队首元素
    • 2.4 实现队列

[数据结构]栈和队列

一.栈

1.栈的基本概念

    栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
在这里插入图片描述

    栈顶(Top):线性表允许进行插入删除的那一端。
 栈底(Bottom):固定的,不允许进行插入和删除的另一端。
 空栈:不含任何元素的空表。

    栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构

1.2 栈的常见基本操作

InitStack():初始化一个空栈S。
StackEmpty():判断一个栈是否为空,若栈为空则返回true,否则返回false。
Push():进栈,栈的插入操作
Pop():出栈,栈的删除操作
GetTop():读栈顶元素

1.3 栈的实现

1.3.1 入栈

 public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        int ret = stack.push(4);
        System.out.println(ret);
    }

1.3.2 出栈

  public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        int ret1 = stack.pop();
        int ret2 = stack.pop();
        System.out.println(ret1);
        System.out.println(ret2);
    }

1.3.3获取栈顶元素

 public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        int ret1 = stack.pop();
        int ret2 = stack.pop();
        int ret3 = stack.peek();
        System.out.println(ret1);
        System.out.println(ret2);
        System.out.println(ret3);
    }

1.3.4 判断栈为空

  public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        int ret1 = stack.pop();
        int ret2 = stack.pop();
        int ret3 = stack.peek();
        System.out.println(ret1);
        System.out.println(ret2);
        System.out.println(ret3);
        stack.pop();
        boolean flag = stack.empty();
        System.out.println(flag);
    }

1.3.5 栈实现

public class MyStack<T> {
    private T[] elem;//数组
    private int top;//当前可以存放数据元素的下标-》栈顶指针
 
    public MyStack() {
        this.elem = (T[])new Object[10];
    }
 
    /**
     * 入栈操作
     * @param item 入栈的元素
     */
    public void push(T item) {
        //1、判断当前栈是否是满的
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //2、elem[top] = item  top++;
        this.elem[this.top++] = item;
    }
 
    public boolean isFull(){
        return this.elem.length == this.top;
    }
 
    /**
     * 出栈
     * @return 出栈的元素
     */
    public T pop() {
        if(empty()) {
            throw new UnsupportedOperationException("栈为空!");
        }
        T ret = this.elem[this.top-1];
        this.top--;//真正的改变了top的值
        return ret;
    }
 
    /**
     * 得到栈顶元素,但是不删除
     * @return
     */
    public T peek() {
        if(empty()) {
            throw new UnsupportedOperationException("栈为空!");
        }
        //this.top--;//真正的改变了top的值
        return this.elem[this.top-1];
    }
    public boolean empty(){
        return this.top == 0;
    }
}
public static void main(String[] args) {
        MyStack<Integer> myStack = new MyStack<>();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println(myStack.peek());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.empty());
        System.out.println("============================");
        MyStack<String> myStack2 = new MyStack<>();
        myStack2.push("hello");
        myStack2.push("word");
        myStack2.push("thank");
        System.out.println(myStack2.peek());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.empty());
 
    }

二.队列

   队列(queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头 (Head/Front)
在这里插入图片描述

2.1 入队

 public static void main(String[] args) {
        Deque<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        
    }

2.2 出队

  public static void main(String[] args) {
        Deque<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
 
    }

2.3 获取队首元素

public static void main(String[] args) {
        Deque<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println("-----------------");
        System.out.println(queue.peek());
    }

2.4 实现队列

class Node {
    private int val;
    private Node next;
    public int getVal() {
        return val;
    }
    public void setVal(int val) {
        this.val = val;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }
    public Node(int val) {
        this.val = val;
    }
}
public class MyQueue {
    private Node first;
    private Node last;
    //入队
    public void offer(int val) {
        //尾插法  需要判断是不是第一次插入
        Node node = new Node(val);
        if(this.first == null) {
            this.first = node;
            this.last = node;
        }else {
            this.last.setNext(node);//last.next = node;
            this.last = node;
        }
    }
    //出队
    public int poll() {
        //1判断是否为空的
        if(isEmpty()) {
            throw new UnsupportedOperationException("队列为空!");
        }
        //this.first = this.first.next;
        int ret = this.first.getVal();
        this.first = this.first.getNext();
        return ret;
    }
    //得到队头元素但是不删除
    public int peek() {
        //不要移动first
        if(isEmpty()) {
            throw new UnsupportedOperationException("队列为空!");
        }
        return this.first.getVal();
    }
    //队列是否为空
    public boolean isEmpty() {
        return this.first == null;
    }
}
 public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        myQueue.offer(1);
        myQueue.offer(2);
        myQueue.offer(3);
        System.out.println(myQueue.peek());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.isEmpty());
       
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你了解真正的数字孪生吗?

数字孪生的目的是在虚拟空间构建数字化的复杂系统“镜像”&#xff0c;可以低成本、反复的从多个视角观察、控制、分析、验证和推演&#xff0c;从而帮助人们更好的在现实世界中完成设计、生产、运营等活动。 近年来&#xff0c;数字孪生技术在航空航天、工业制造、交通物流等多…

hbase2.x HBCK Report Region Holes Overlaps问题修复

Region Holes 查看该问题可通过master UI界面的HBCK Report查看 最下方RegionInfo展示了哪两个region之间存在空洞 也可以通过master日志查看 解决步骤 解决方法很简单&#xff0c;直接使用 hbck2 提供的 fixMeta 操作即可。 在 Usage 说明中能看到 fixMeta 能够修复 ‘…

【Linux】make/Makefile的使用

本文目录 背景简介 使用方法 为什么执行的指令是make和make clean呢&#xff1f; gcc如何判断文件是否需要重新执行&#xff1f; 背景简介 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefifile定义了一系列的规则来指定…

16万字智慧医疗-医院信息化大数据建设 方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目 录 1 概述 1.1 现状分析 …

人工智能-网络编程、TCP

目录1、网络编程1.1网络介绍1.2IP地址1.3 ifconfig和ping命名1.4端口和端口号1.5端口号的分类1.6 socket介绍1.7 TCP介绍&#xff12;、TCP的网络应用程序开发2.1 python&#xff13;编码转换2.2 TCP客户端程序开发流程2.3 TCP客户端程序开发2.4 TCP服务端程序开发流程2.5 TCP…

[Android]序列化原理Parcelable

Parcelable是Android为我们提供的序列化的接口&#xff0c;Parcelable相对于Serializable的使用相对复杂一些&#xff0c;但Parcelable的效率相对Serializable也高很多&#xff0c;这一直是Google工程师引以为傲的&#xff0c;Parcelable和Serializable的效率对比Parcelable vs…

CesiumLab中对输入人工模型的格式要求 CesiumLab系列教程

人工模型数据&#xff08;或者手工模型数据&#xff09;是三维 GIS 行业发展的最早的需求来源&#xff0c;通过3dsmax&#xff0c;maya 等建模工具人工建模的数据。 ​ 编辑 人工模型 这张图是cesiumlab上对人工模型来源的流程&#xff0c;在上面我们只罗列了四个建模工具&a…

Rabbitmq消息队列详解(二)——消息模式API

官网提供的消息模式&#xff1a; 依赖&#xff1a; <!-- 加入rabbitmq --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>hello模型 没有交换机&…

电商物流第三方云仓到底是什么?

仓库能够简单地定义为一个规划空间&#xff0c;通常是一个用于处置和贮存货物的大型商业建筑。因而&#xff0c;仓储是指在这样一个规划空间中存储和处置货物所触及的一切过程。仓库中常见的货物包括&#xff1a;;机械零配件、建筑资料、废品农产品、家具和电子产品。仓库中的一…

Git、GitHub、Gitee、GitLab

Git、GitHub、Gitee、GitLab 文章目录前言一、Git1.1 Git概述1.2 版本控制1.3 为什么需要版本控制1.4 版本控制工具1.5 Git简史1.6 Git工作机制1.7 Git和代码托管中心二、Git安装三、 Git常用命令3.1 设置用户签名3.2 初始化本地库3.3 查看本地库状态3.3.1 首次查看&#xff08…

【c++】 仿函数的概念详解与基础实现

四、仿函数 函数对象(仿函数)是一个类&#xff0c;不是一个函数。 函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。分类:假定某个类有一个重载的operator()&#xff0c;而且重载的operator()要求获取一个参数&#xff0c;我们就将这个类称为“一元仿函数”&…

【算法笔记】最近公共祖先(LCA)算法求解——倍增算法

0. 前言 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 这种算法应用很广泛&#xff0c;可以很容易解决树上最短路等问题。 为了方便&#xff0c;我们记…

再获认可!知道创宇入选《2022中国各地区科创之星势力图3.0版》

近日&#xff0c;由数据智能产业创新服务领域的垂直、专业深度媒体数据猿推出的《2022中国各地区科创之星势力图3.0版》正式公布。知道创宇凭借网络安全领域过硬的技术实力与创新能力入选“科创之星势力图”。二度认可知道创宇再获科创之星优秀企业本次数据猿公布的《2022中国各…

第十九章AJAX学习

文章目录什么是AJAX服务器端渲染Ajax渲染&#xff08;局部更新&#xff09;前后端分离同步与异步同步异步前端提交到数据到后端的方式JSON什么是JSONJSON数据格式JSON对象JSON格式表示简单数组对象数组使用二维数组保存对于客户端对于服务器端引入GSON的jar包使用例子Axios简介…

MySQL数据库:库和表的基本操作

SQL注意事项 1.每条sql语句都要以英文分号结尾。 2.sql语句不区分大小写。 3.定义库、表&#xff0c;或是表中的字段&#xff0c;名称不要使用关键字。 一、数据库的操作 1.显示所有的数据库 show databases; 2.创建数据库 方式一&#xff1a; create database 数据库名称…

vue+elementui导入Excel文件(基于vue-element-admin中的uploadExcel组件), 然后 go-zero进行逻辑处理功能

#前端代码 html代码 <el-button v-waves class"filter-item" type"primary" icon"add" click"downLoadExlce">模板下载</el-button> <el-upload class"upload" action :multiple"false" :show-…

2.两数相加(链表)

题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会…

【Linux】动静态库的制作和使用

目录 一、可执行文件的形成 二、静态库 2.1 制作静态库 2.2 使用静态库 三、动态库 3.1 动态库的制作 3.2 动态库链接 2.3 动态库的加载 一、可执行文件的形成 在C语言中&#xff0c;函数库文件分为两种类型&#xff1a; 静态库&#xff08;库程序是直接注入目标程序…

想要做成一件事,就得有方法,怎么做到呢

想要完成一件事&#xff0c;没有详细的计划和方法是做不好的。如果没有计划&#xff0c;没有方案&#xff0c;没有策略&#xff0c;没有规划&#xff0c;没有方法&#xff0c;那就是一只无头苍蝇&#xff0c;到处乱撞&#xff0c;不能达到什么目的。想做成一件事&#xff0c;就…

后端人眼中的Vue(二)

三、Vue基本语法 3.1、展示数据 3.1.1、v-text 3.1.1.1、简介 ​ 和插值表达式&#xff08;{{}}&#xff09;一样&#xff0c;用于获取vue实例中data属性声明的数据。用法是在哪个标签上获取就直接在哪个标签上定义v-text或者是v-html。相当于javascript中的innerText。直接…