
数据结构
探索程序的数据结构
原来是涛涛啊
为之奋斗!
展开
-
队列与栈
3.如何用栈实现队列的功能实现思想:两个栈,一个栈A用作队列的入口,负责插入新元素,另一个栈B用作队列的出口,负责移除元素先对栈A进行入栈操作,顺序为1,2,3,然后出栈,顺序为3,2,1再按照出栈的顺序3,2,1向栈B入栈,然后出栈,出队操作是从栈B中弹出元素 private Stack<Integer> stackA = new Stack<Integer>(); private Stack<Integer> stackB = new St原创 2021-01-02 08:57:22 · 118 阅读 · 0 评论 -
队列与栈
2.包含min函数的栈//实现定义栈的数据结构,在该类型中实现一个能够得到栈最小元素的min函数class DataStack{ Stack<Integer> dataStack = new Stack<Integer>();//数据栈 Stack<Integer> minStack = new Stack<Integer>();//辅助栈 Integer temp; public void push(int node) {原创 2021-01-02 08:55:07 · 119 阅读 · 0 评论 -
队列与栈
1.用队列实现栈算法描述:入栈顺序:a,b,c,d 出栈顺序:d,c,b,a设置两个队列,首先让所有元素入队A,从A队列中出队A.length-1个元素,进入到队列B,,此时A队列中剩下d,将d出栈;然后将B队列中B.length-1个元素出队,进入到队列A,此时B队列中剩下c,将c出栈…以此类推,就可得到出栈顺序为d,c,b,a...原创 2021-01-02 08:54:14 · 159 阅读 · 0 评论 -
二叉树--后序遍历
后序遍历:左右根,从叶子结点开始//递归public static void postOrder(TreeNode root){ if(root != null){ postOrder(root.lchild); postOrder(root.rchild); System.out.println(root.data + " "); }}//后序遍历---非递归public List<TreeNode> postOrder(TreeNode..原创 2021-01-02 08:47:34 · 192 阅读 · 0 评论 -
二叉树--中序遍历
中序遍历:左根右,从与主根邻近的左树开始//递归public static void inOrder(TreeNode root){ if(root != null){ inOrder(root.lchild); System.out.println(root.data + " "); inOrder(root.rchild); }}//中序遍历Stack<TreeNode> stack = new Stack<>();Li..原创 2020-12-31 17:34:49 · 106 阅读 · 0 评论 -
二叉树--前序排列
前序排列:根左右,从主根开始//递归public static void preOrder(TreeNode root){ if(root != null){ Sysout.out.println(root.data + ""); preOrder(root.lchild); preOrder(root.rchild); }}//前序遍历---非递归Stack<TreeNode> stack = new Stack<&原创 2020-12-31 17:31:56 · 359 阅读 · 0 评论 -
链表--如何在单向链表中找出第k个元素?
3.如何在单向链表中找出第k个元素?方法1:先把链表遍历一遍,得到链表的总长度 getLength(),得到size后,从链表的第一个开始遍历 (size-index)个,就可以得到(遍历两次)public static Node findNode(Node head,int index){ if(head.next == null){//判空 return null; } int size = getLengt原创 2020-12-31 17:29:52 · 2627 阅读 · 0 评论 -
链表--合并两个有序单链表
2.合并两个有序单链表步骤:首先通过比较确定新链表的头节点,然后移动链表1或者链表2的头指针,然后通过递归来得到新的链表头节点的next指针。public static Node mergeList(Node list1 , Node list2){ if(list1==null) return list2; if(list2==null) return list1; Node resultNode; if(list1.val&原创 2020-12-31 17:28:55 · 558 阅读 · 0 评论 -
链表---单链表反转
1.单链表反转反转步骤:从头到尾遍历一遍链表,每遍历一个结点,将其放在新链表的最前端。注意链表为空和只有一个结点的情况。public static Node reverseNode(Node head){ // 如果链表为空或只有一个节点,无需反转,直接返回原链表表头 if(head == null || head.next == null) return head; Node reHead = null; Node cur原创 2020-12-31 17:27:52 · 99 阅读 · 0 评论 -
二分查找算法
二分查找算法实现步骤:假设表中元素是按照升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功。否则利用中间位置将表分为两部分,如果中间记录的关键字大于查找关键字,则在前面的表中进行查找,否则在后面的表中进行查找重复上述过程,直到找到满足条件的记录,如果找不到,则查找失败。算法前提:必须采用顺序存储结构,按照关键字大小有序排列。适用于不经常变动查找频繁的表。实现方式:递归实现、非递归实现 /** * 二分查找算法:递归实现 * @param原创 2020-12-31 17:26:54 · 179 阅读 · 0 评论 -
插入排序
4.插入排序算法描述:—先向后移,在插入,O(n^2),稳定从第一个元素开始,该元素可以被认为已经排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一个位置重复步骤3,直到找到已排序的元素小于或等于新元素的位置将元素插入到该位置后,重复2~5 //插入排序 public static int[] insertSort(int[] arr) { for (int i = 1; i < arr.length原创 2020-12-31 17:25:06 · 103 阅读 · 0 评论 -
选择排序
3.选择排序算法描述:O(n^2),不稳定初始状态:无序区为R[1…n],有序区为空。第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别是R[1,…I-1]和R[i,…n]。该趟排序从当前无序区中选出关键字最小的记录R[K],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n]分别变为记录个数增加1个的新有序区和记录个数减少一个的新无序区 //选择排序 public static int[] selectSort(int[] arr) {原创 2020-12-31 17:23:42 · 134 阅读 · 0 评论 -
快速排序
2.快速排序算法描述:O(nlog2n),不稳定从数列中挑出一个元素,称为 “基准” ,每趟从数据序列的两端开始交替执行分区操作:重新排列数列,比基准小的放在基准前面,比基准大的,放在基准后面,相等的则可以到任一边递归的将小于基准元素的子数列和大于基准元素的子数列排序 //快速排序 /* 1.设置两个变量i,j,排序开始的时候i=0;j=6; 2.以第一个数组元素作为关键数据,赋值给key,即key=a[0]; 3.从j开始向前搜索,即由后开始向前搜索(原创 2020-12-31 17:21:59 · 85 阅读 · 0 评论 -
冒泡排序
1.冒泡排序[外链图片算法描述:------稳定,O(n^2) 外层控制冒泡轮数,内层进行比较比较相邻的元素。如果第一个比第二个大,就交换它们对每一对相邻元素做同样的操作,从最开始到最后一对,这样在元素最后应该是最大的 public static int[] getResult(int[] arr) { for (int i = 0; i < arr.length-1; i++) { int temp; boole原创 2020-12-31 17:19:28 · 98 阅读 · 0 评论