一、 栈
1、什么是栈
栈(stack)是一个先入后出(FILO-First In Last Out)的有序列表。
栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
根据堆栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
栈主要两个操作: 入栈(push)和出栈(pop)
2、栈应用场景
子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
表达式的转换与求值(实际解决), 计算器原理。
二叉树的遍历。
图形的深度优先(depth一first)搜索法。
3、 链表
(1)什么是链表
链表也是一种有序列表, 其中的各对象按线性顺序排列.
数组的线性顺序是由数组下标决定的, 而链表的顺序是由各个对象里的指针决定的.
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。 链表作为一种基础的数据结构可以用来生成其它类型的数据结构
根据链表结构不同, 链表分为: 单向链表, 双向链表和循环链表.
(2)实现单向链表
单向链表是一种最简单的链表,它包含两个域,一个信息域和一个指针域。这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值。
实现单向链表的具体代码实现:
需求:判断添加的元素元素是否存在
package
控制台打印输出信息:
(3)实现双向链表
双向链表也叫双链表。双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。这样可以从任何一个节点访问前一个节点,当然也可以访问后一个节点,以至整个链表。
一般是在需要大批量的另外储存数据在链表中的位置的时候用。双向链表也可以
实现双向链表具体代码实现:
package
控制台打印输出信息:
(4)双向循环链表
在一个循环链表中, 首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可实现。
实现双向循环链,表具体代码实现:
package
控制台打印输出信息:
(5)使用循环链表求解约瑟夫(Josephu )问题
问题描述:
设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直至剩下一个人为止。
实现循环链表求解约瑟夫,具体代码实现:
package
控制台打印输出信息:
3