
数据结构和算法
旺仔碎碎
这个作者很懒,什么都没留下…
展开
-
栈(3)中缀表达式转后缀表达式并计算
中缀表达式转后缀表达式思路分析若栈顶元素不是运算符,也直接压入S1初始化两个栈:运算符栈S1和存储中间结果栈S2从左至右扫描中缀表达式遇到操作数时:直接入S2栈遇到运算符时:比较其与S1栈顶运算符的优先级若S1为空或栈顶元素为 (,将次运算符压入S1若次运算符的优先级大于S1栈顶元素的优先级,就将其直接入S1否则,将S1栈顶元素弹出并压到S2中,在转到第四步与s1中新的栈顶运算符比较遇到括号时:如果是左括号,直接压入S1如果是右括号,依次弹出S1栈顶的运算符,并压入S2,直原创 2021-04-12 14:16:24 · 142 阅读 · 0 评论 -
栈(2)前缀、中缀、后缀表达式
前缀表达式:遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈重复上述过程直到表达式最右端,最后运算出的值就是表达式的结果例:(2+4)5-6 ->34+56-中缀表达式:我们日常计算的后缀表达式(逆波兰表达式):从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈重复上述过程直到表达式最右端,最后运算出的值就是表达式的结果例:(2+4)5-6 ->34+56-tips:观看.原创 2021-04-12 13:45:38 · 110 阅读 · 0 评论 -
栈(1)
栈实现综合计算器思路通过一个index来遍历表达式如果是数字,直接入数栈如果是符号符号栈为空,直接入符号栈符号栈不为空:当前操作符的优先级小于等于栈中的操作符,就从数栈中pop出两个数,再从符号栈中pop一个符号进行运算,将得到的结果入数栈当前操作符的优先级大于栈中的操作符,就直接入符号栈当表达式扫描完毕,就顺序从数栈和符号栈中pop出相应的数和符号,并运行最后在数栈只有一个数字,就是表达式结果import java.util.Scanner;public cl原创 2021-04-12 13:42:38 · 244 阅读 · 0 评论 -
链表来模拟栈
链表来模拟栈public class LinkedStackDemo { public static void main(String[] args) { StackNodeList stackNodeList=new StackNodeList(); int key=-1; boolean loop=true;//控制是否退出菜单 Scanner scanner=new Scanner(System.in); w.原创 2021-04-08 11:06:29 · 141 阅读 · 0 评论 -
使用数组来模拟栈
思路分析使用数组来模拟栈定义一个top来表示栈顶,初始化为-1入栈操作:top++;stack[top]=data;出栈操作: int value=stack[pop];pop–;return value;数组模拟栈import java.util.Scanner;public class ArrayStackDemo { public static void main(String[] args) { ArrayStack arrayStack = new.原创 2021-04-08 11:05:45 · 95 阅读 · 0 评论 -
栈的使用场景和介绍
场景子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,回到原来的程序中处理递归调用:只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈。表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)二叉树的遍历图的深度优先搜素法介绍是一个先入后出的有序列表限制线性表中元素的插入和删除只能在线性表的同一端进行。允许插入和删除的一端称为栈顶,另一端为栈底。最先放入栈中的元素在栈底,最后放入的元素在栈顶而删除元素正好相反,最后放.原创 2021-04-08 11:04:19 · 1014 阅读 · 0 评论 -
稀疏数组的全套Java实现
稀疏数组介绍 当一个数组中大部分元素为0或者同一个值的数组是,可雅使用稀疏数组。处理方法:记录数组一共几行几列,有多少个不同值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而虽小程序规模实际需求:棋盘存盘退出和续上盘思路二位数组转稀疏数组的思路:(稀疏数组的第一行存的是行数和列数)遍历原始的二维数组,得到有效数据的个数根据sum就可以创建稀疏数组sparseArr int[sum+1] [ 3]将二维数组的有效数据存入到稀疏数组中稀疏数组转原始的二维数组的原创 2021-04-05 13:01:06 · 83 阅读 · 0 评论 -
队列的全套Java实现
队列介绍队列是一个有序链表,可以用数组或是链表来实现遵循先入先出的原子应用场景医院排队叫号数组模拟队列public class test {//[1,3,5,6], 5//输出: 2 public static void main(String[] args) { //创建一个队列 ArrayQueue queue = new ArrayQueue(3); char key=' ';//接受用户输入 Sca原创 2021-04-05 12:59:37 · 131 阅读 · 0 评论 -
单链表的面试题五:合并两个有序的单链表(合并后有序)
5)合并两个有序的单链表(合并后有序)public class Main { public static void main(String[] args) { HeroNode heroNode=new HeroNode(1,"a","a"); HeroNode heroNode2=new HeroNode(5,"b","b"); HeroNode heroNode3=new HeroNode(6,"c","d"); HeroNode原创 2021-04-05 12:57:57 · 180 阅读 · 0 评论 -
单链表的面试题四:两种方式实现从尾到头打印单链表
4)从尾到头打印单链表要求: 方式一(见上篇博客)先将单链表进行反转,再遍历,这样做的问题是会破坏原来的单链表的结构,不建议方式二:利用栈这个数据结构,将各个节点压入栈中,利用栈的先进后出的特点,就实现了逆序打印 public void reversetList2(HeroNode head){ if(head.next==null||head.next.next==null){ return; } Stack<He原创 2021-04-05 12:57:24 · 288 阅读 · 0 评论 -
单链表的面试题三:单链表的反转
3)单链表的反转思路:先定义一个节点reverseHead从头到尾遍历原来的链表,每遍历一个节点,就将其取出,放在链表的最前端原来的链表的head.next=reverseHead.next代码实现 public void reversetList(HeroNode head){ //如果当前链表为空或者只有一个节点,无需反转,直接返回 if(head.next==null||head.next.next==null){原创 2021-04-05 12:56:29 · 156 阅读 · 0 评论 -
单链表的面试题二:查找单链表中的倒数第k个节点
2)查找单链表中的倒数第k个节点public HeroNode findLastIndexNode(HeroNode head,int index){ if(head.next==null){ return null; } int getlen = getlen(head); //获得链表长度 if(index<=0||index>getlen){原创 2021-04-05 12:55:43 · 141 阅读 · 0 评论 -
单链表的面试题一:求单链表中有效节点个数
单链表的面试题1)求单链表中有效节点个数如果是带头节点的链表,需求不统计头结点public class Main { public static void main(String[] args) { HeroNode heroNode=new HeroNode(1,"a","a"); HeroNode heroNode2=new HeroNode(2,"b","b"); HeroNode heroNode3=new HeroNode(6,"c",原创 2021-04-05 12:54:52 · 344 阅读 · 0 评论 -
单链表的全套Java实现
单链表单链表的无序插入单链表的创建直接添加到尾部public class SinleLinkedListDemo { public static void main(String[] args) { HeroNode heroNode=new HeroNode(1,"a","a"); HeroNode heroNode2=new HeroNode(2,"b","b"); HeroNode heroNode3=new HeroNode(3,"c",原创 2021-04-05 12:51:53 · 107 阅读 · 0 评论 -
约瑟夫的解析与Java实现
约瑟夫问题思路构建一个单向的环形链表先创建第一个节点,让first指向该节点,并形成环形后面当我们每创建一个新的节点,就把该节点加入到已有的环形链表遍历环形链表先让一个辅助指针(变量)curboy指向first节点然后通过一个while循环遍历该环形链表即可curBoy.next==first结束出圈顺序创建一个辅助指针helper,事先应该指向环形链表的最后这个节点(在报数前,先让first和helper移动k-1次,即移动到k个小孩这)当小孩报数时,让firs原创 2021-04-05 12:48:57 · 111 阅读 · 0 评论 -
双链表的增删改查(包括有序、无序添加)
单链表的缺点查找的方向只能是一个方向,而双向链表可以向前或者向后查找单向链表不能自我删除,需要靠辅助节点,而双向链表可以,所有单链表删除节点总是找到temp,temp是待删除节点的前一个节点思路:(1)遍历:和单链表一样,只是可以向前、也可以向后查找(2) 添加(默认添加到双向链表的最后)找到双向链表的最后一个节点temp.next=newHeroNodenewHeroNode.pre=temp(3)修改思路和原理与单链表相似(4)删除因为是双向链表,因此可以实现自我删除某个原创 2021-04-05 12:45:28 · 428 阅读 · 0 评论