数据结构和算法——线性结构(1)数组、栈、队列和单链表
1. 数组
● 面向对象: add 、insert 、get 、delete
● 查找算法:线性查找 (依次对比查找,效率低)、二分查找(前提是有序数组)
二分查找思路:
import java.util.Scanner;public class BinarySearch {public static void main(String[] args) {//定义目标数组int[] arr = {1,2,3,4,5,6,7,8};//记录初始、结束、中间位置int begin = 0;int end = arr.length-1;int mid = (begin + end)/2;System.out.println("请输入要查找的元素:");Scanner scanner = new Scanner(System.in);int target = scanner.nextInt();int index = -1;//循环查找元素while (true){if (target > arr[end] || target < arr[begin] ) {throw new RuntimeException("输入的数不存在");}//中间元素刚好是要查找的元素else if (arr[mid] == target) {index = mid;break;} else { //中间元素大于目标元素if (arr[mid] > target) {//调整结束的位置end = mid - 1;//中间元素小于目标元素} else {//调整开始位置begin = mid + 1;}}mid = (begin + end)/2;}System.out.println("要查找的元素:"+target+"\t"+"索引是:"+index);}
}
执行结果:
图 1-1 运行结果截图
2. 栈
栈是一种基于先进后出策略的数据类型。就例如你在网上冲浪,点击一个超链接,浏览器会显示一个新的页面,并将它压入一个栈,你可以通过不断点击超链接来浏览新的页面,但总可以通过点击“回退”重新浏览以前的页面。栈的先进后出就是这样的原理。
public class StackDemo {int[] elements;public StackDemo(){elements = new int[0];}//入栈public void push(int element){int[] newArr = new int[elements.length+1];for (int i = 0; i < elements.length; i++) {newArr[i] = elements[i];}newArr[elements.length] = element;elements = newArr;}//查看栈中的元素public int[] showElement(){return elements;}//查看栈顶元素public int showTopElement(){return elements[elements.length-1];}//出栈,取出栈顶元素public int pop(){int[] newArr = new int[elements.length-1];int topElement = elements[elements.length-1];for (int i = 0; i < elements.length - 1; i++) {newArr[i] = elements[i];}elements = newArr;return topElement;}//查看栈是否为空public boolean isEmpty(){return elements == null;}
}
import java.util.Arrays;public class Test {public static void main(String[] args) {StackDemo stackDemo = new StackDemo();stackDemo.push(0);stackDemo.push(1);stackDemo.push(2);stackDemo.push(3);stackDemo.pop();int[] arr = stackDemo.showElement();System.out.println(Arrays.toString(arr));System.out.println();boolean b = stackDemo.isEmpty();System.out.println(b);}
}
执行结果:
图 1-2 运行结果截图
3. 队列
队列的时间原理和栈类似,最大的不同就是队列中的元素是先进先出的。
public class MyQueue {int[] elements;//构造方法在创建对象时创建一个长度为0的新数组public MyQueue(){elements = new int[0];}//入队,向队列中添加元素public void add(int element){int[] newArr = new int[elements.length+1];for (int i = 0; i < elements.length; i++) {newArr[i] = elements[i];}newArr[elements.length] = element;elements = newArr;}//查看队列中的元素public int[] showElements(){return elements;}//出队public int poll(){if(elements == null){throw new RuntimeException("Queue is empty");}int element = elements[0];int[] newArr = new int[elements.length-1];for (int i = 1; i < elements.length - 1; i++) {newArr[i] = elements[i];}elements = newArr;return element;}//查看队列是否为空public boolean isEmpty(){return elements == null;}
}
import java.util.Arrays;public class MyTest {public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.add(0);myQueue.add(1);myQueue.add(2);myQueue.add(3);int[] arr = myQueue.showElements();System.out.println(Arrays.toString(arr));int i = myQueue.poll();System.out.println(i);boolean b = myQueue.isEmpty();System.out.println(b);}
}
执行结果:
图 1-3 运行结果截图
4. 单链表
链表是一种递归的数据结构,它或者为空(null),或者是指向下一个结点(node)的引用,该结点的内容包括一个元素和一个指向另一条链表的引用。
代码演示:
public class Node {int data;Node next;public Node(int data){this.data = data;}//为链表追加结点public Node append(Node node){//设置当前结点Node currentNode = this;//循环向后找尾结点while (true){Node nextnode = currentNode.next;if (nextnode == null){break;}else{currentNode = nextnode;}//追加结点}currentNode.next = node;return this;}// 删除下一个结点public void removeNext(){//取出下下个结点Node nextNode = this.next.next;//把当前结点的下一个结点追加为下下个结点this.next = nextNode;}//显示链表中的所有内容public void show(){//设置当前结点Node currentNode = this;while (true){System.out.print(currentNode.data+" ");//重新设置当前结点currentNode = currentNode.next;//如果是最后一个结点if (currentNode == null){break;}}System.out.println();}//在任意位置插入一个节点public void after(Node node){//把当前节点的下一个结点定义为下下个节点Node nextNext = this.next;//插入节点this.next = node;//把下下个节点插入node.next = nextNext;}//获取下一个结点public Node getNext(){return this.next;}//获取结点中的内容public int getData(){return this.data;}
}
//测试类
public class TestNode {public static void main(String[] args) {Node n1 = new Node(1);Node n2 = new Node(2);Node n3 = new Node(3);Node n4 = new Node(4);Node n5 = new Node(5);//把节点连接起来n1.append(n2).append(n3).append(n4);//显示链表中的内容n1.show();//插入节点n5n1.after(n5);n1.show();//删除某个节点n1.removeNext();n1.show();}
}
执行结果:
图 1-4 运行结果截图
数据结构和算法——线性结构(1)数组、栈、队列和单链表相关推荐
- (一)数据结构与算法-线性结构和非线性结构
线性结构和非线性结构 数据结构包括:线性结构和非线性结构 线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序存储借故偶和链式存储结构 ...
- 数据结构与算法——线性结构——线性表及其表示
-"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...
- 【自学笔记】尚硅谷数据结构与算法Chapter 2 稀疏数组和队列
Chapter 2 稀疏数组和队列 文章目录 Chapter 2 稀疏数组和队列 2.1 稀疏数组 2.1.1 基本介绍 2.1.2 应用案例 2.2 队列 2.2.1 队列介绍 2.2.2 用数组模 ...
- 数据结构和算法:(3)3.2.2单链表的整表删除
我们不使用这个单链表时,我们需要把他在内存中释放掉,以便于流出空间给其他程序和软件使用. 单链表整表删除的算法思路如下: 声明结点p和q: 将第一个结点赋值给p,下一个结点(也就是第一个结点的下一个结 ...
- 数据结构和算法:(3)3.2.1单链表的整表创建
对于顺序存储结构的线性表的整表创建,我们可以用数组的初始化来直观理解.(因为之前说过我们线性表的顺序存储结构呢事实上也就是在数组的基础上加多一个变量来存储当前线性表的长度构成的一个结构,所以我们用数组 ...
- (王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表
文章目录 一:循环链表定义 二:循环单链表 三:循环双链表 一:循环链表定义 循环链表:规定好头尾结点的指向形成成环状 循环单链表:其尾节点的next指针由原本的空改为指向头结点 循环双链表:其尾节点 ...
- 数据结构与算法单排日记-2020/3/4-链表之单链表
流程: 单链表的应用实例 1. 单链表的建立: 使用带head头的单向链表实现 –水浒英雄排行榜管理 完成对英雄人物的增删改查操作, 注: 删除和修改,查找 第一种方法在添加英雄时,直接添加到链表的尾 ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- Java数据结构和算法:字符串、数组和广义表
数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...
- 两顺序栈共享Java_数据结构与算法(三),栈与队列
上一篇<数据结构与算法(二),线性表>中介绍了数据结构中线性表的两种不同实现--顺序表与链表.这一篇主要介绍线性表中比较特殊的两种数据结构--栈与队列.首先必须明确一点,栈和队列都是线性表 ...
最新文章
- 基于电子邮件的InfoPath表单发布的注意点 [Infopath 2007]
- 女生心中的理想男生!这些条件你符合几条?
- 是什么摧毁了程序员的工作效率
- python循环括号_Python for循环内括号语法
- 深度学习资源一网打尽!论文、数据集、框架、课程、图书等应有尽有
- jeesite+mysql,数据导入出现问题。
- BP神经网络的基本思想,bp神经网络原理简述
- 企业战略规划书籍推荐
- 自动收取蚂蚁森林能量雨
- python,别特么显示科学计数法了
- asp.net 生成二维码,带logo,带下方文字
- JavaEE进阶——FreeMarker模板引擎
- C++设计模式——享元模式(高屋建瓴)
- vue使用ckeditor4富文本编辑器配置
- unity物体边缘发光shader_Shaderlab Notizen 15 Rim Shader(边缘发光)的两种实现形态
- 第一个实训项目(2)
- 计算机专业英语2013影印,计算机专业英语2013影印版重点翻译
- 我对位运算的若干疑问和认识
- 通过url保存图片及微信头像保存到本地
- 摹客专访|专访Veer图库运营总监郭海燕
热门文章
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Swift - EasingAnimation绘制圆环动画
- JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
- ECharts学习总结(一):ECharts的第一个图表
- (回溯法)和为n的所有不增正整数和式分解算法
- 我开发的内部ORM(一)数据库组件
- python 映射网络驱动器_用Delphi实现网络驱动器的映射和断开
- 拓端tecdat|R语言缺失值的处理:线性回归模型插补
- 随机森林 ---sklearn
- hibernate教程笔记8