package package1;
public interface LList<T> {
/**
* 判断线性表是否空
* @return
*/
boolean isEmpty();
/**
* 返回线性表长度
* @return
*/
int length();
/**
* 返回第i(i≥0)个元素
* @param i
* @return
*/
T get(int i);
/**
* 设置第i个元素值为x
* @param i
* @param x
*/
void set(int i, T x);
/**
* 插入x作为第i个元素
* @param i
* @param x
*/
void insert(int i, T x);
/**
* 在线性表最后插入x元素
* @param x
*/
void append(T x);
/**
* 删除第i个元素并返回被删除对象
* @param i
* @return
*/
T remove(int i);
/**
* 删除线性表所有元素
*/
void removeAll();
/**
* 查找,返回首次出现的关键字为key元素
* @param key
* @return
*/
T search(T key);
}
-------------------------------------------------
package package1;
public class Node<T> {
/**
* 数据域,保存数据元素
*/
public T data;
/**
* 地址域,引用后继结点
*/
public Node<T> next;
/**
* 构造结点,data指定数据元素,next指定后继结点
*
* @param data
* @param next
*/
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}
/**
* 构造节点
*/
public Node() {
this(null, null);
}
/**
* 返回结点元素值对应的字符串
*/
@Override
public String toString() {
return this.data.toString();
}
/**
* 比较两个结点值是否相等,覆盖Object类的equals(obj)方法
*/
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
return obj == this || obj instanceof Node && this.data.equals(((Node<T>)obj).data);
}
}
--------------------------------------------------------------------
package package1;
public class SinglyLinkedList<T> implements LList<T> {
/**
* 头指针,指向单链表的头结点
*/
public Node<T> head;
/**
* 默认构造方法,构造空单链表
*/
public SinglyLinkedList() {
// 创建头结点,data和next值均为null
this.head = new Node<T>();
}
/**
* 由指定数组中的多个对象构造单链表。采用尾插入构造单链表
* 若element==null,Java将抛出空对象异常;若element.length==0,构造空链表
*
* @param element
*/
public SinglyLinkedList(T[] element) {
// 创建空单链表,只有头结点
this();
// rear指向单链表最后一个结点
Node<T> rear = this.head;
for (int i = 0; i < element.length; i++) {
rear.next = new Node<T>(element[i], null);
rear = rear.next;
}
}
/**
* 判断单链表是否空,O(1)
*/
@Override
public boolean isEmpty() {
return this.head.next == null;
}
/**
* 返回单链表长度,O(n), 基于单链表遍历算法
*/
@Override
public int length() {
int i = 0;
// p从单链表第一个结点开始
Node<T> p = this.head.next;
// 若单链表未结束
while (p != null) {
i++;
// p到达后继结点
p = p.next;
}
return i;
}
/**
* 返回第i(≥0)个元素,若i<0或大于表长则返回null,O(n)
*/
@Override
public T get(int i) {
if (i >= 0) {
Node<T> p = this.head.next;
for (int j = 0; p != null && j < i; j++) {
p = p.next;
}
// p指向第i个结点
if (p != null) {
return p.data;
}
}
return null;
}
/**
* 设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作。O(n)
*/
@Override
public void set(int i, T x) {
if (x == null)
return;
Node<T> p = this.head.next;
for (int j = 0; p != null && j < i; j++) {
p = p.next;
}
if (i >= 0 && p != null) {
p.data = x;
} else {
throw new IndexOutOfBoundsException(i + "");
}
}
/**
* 插入第i(≥0)个元素值为x。若x==null,不插入。 若i<0,插入x作为第0个元素;若i大于表长,插入x作为最后一个元素。O(n)
*/
@Override
public void insert(int i, T x) {
// 不能插入空对象
if (x == null) {
return;
}
// p指向头结点
Node<T> p = this.head;
// 寻找插入位置
for (int j = 0; p.next != null && j < i; j++) {
// 循环停止时,p指向第i-1结点或最后一个结点
p = p.next;
}
// 插入x作为p结点的后继结点,包括头插入(i<=0)、中间/尾插入(i>0)
p.next = new Node<T>(x, p.next);
}
/**
* 在单链表最后添加x对象,O(n)
*/
@Override
public void append(T x) {
insert(Integer.MAX_VALUE, x);
}
/**
* 删除第i(≥0)个元素,返回被删除对象。若i<0或i大于表长,不删除,返回null。O(n)
*/
@Override
public T remove(int i) {
if (i >= 0) {
Node<T> p = this.head;
for (int j = 0; p.next != null && j < i; j++) {
p = p.next;
}
if (p != null) {
// 获得原对象
T old = p.next.data;
// 删除p的后继结点
p.next = p.next.next;
return old;
}
}
return null;
}
/**
* 删除单链表所有元素 Java将自动收回各结点所占用的内存空间
*/
@Override
public void removeAll() {
this.head.next = null;
}
/**
* 顺序查找关键字为key元素,返回首次出现的元素,若查找不成功返回null
* key可以只包含关键字数据项,由T类的equals()方法提供比较对象相等的依据
*/
@Override
public T search(T key) {
if (key == null)
return null;
for (Node<T> p = this.head.next; p != null; p = p.next)
if (p.data.equals(key))
return p.data;
return null;
}
/**
* 返回单链表所有元素的描述字符串,形式为“(,)”,覆盖Object类的toString()方法,O(n)
*/
@Override
public String toString() {
String str = "(";
for (Node<T> p = this.head.next; p != null; p = p.next) {
str += p.data.toString();
if (p.next != null)
str += ","; // 不是最后一个结点时后加分隔符
}
return str + ")"; // 空表返回()
}
/**
* 比较两条单链表是否相等
*/
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj instanceof SinglyLinkedList) {
SinglyLinkedList<T> list = (SinglyLinkedList<T>) obj;
return equals(this.head.next, list.head.next);
}
return false;
}
/**
* 比较两条单链表是否相等,递归方法
*
* @param p
* @param q
* @return
*/
private boolean equals(Node<T> p, Node<T> q) {
return p == null && q == null || p != null && q != null
&& p.data.equals(q.data) && equals(p.next, q.next);
}
}
----------------------------------------------------------
package package1;
// 文档的分割与合并, 基于大文档
public class test {
public static void main(String[] args) {
SinglyLinkedList<String> lista = new SinglyLinkedList<String>();
for (int i = 0; i <= 5; i++)
lista.insert(i, new String((char) ('A' + i) + ""));
System.out.println("本案例中链表的初始位置是0,即 元素是从第0个位置开始数的\n ");
System.out.println("数组lista的所有元素值依次插入到单链表中,数据分别是:\n " + lista.toString());
System.out.println("单链表的长度是length()="+ lista.length());
System.out.println("返回第0个链表节点值lista.get(0):"+ lista.get(0) );
System.out.println("返回最后一个链表节点值lista.get(5):"+ lista.get(5) );
lista.set(0, new String((char) (lista.get(0).charAt(0) + 32) + ""));
System.out.println("修改 链表的第0个数据值 数据后,新的链表元素值分别是:\n" + lista.toString());
String x="x";
lista.insert(2, x);
System.out.println("单链表第二个位置插入x后,数据分别是:\n"+ lista.toString() );
lista.remove(6);
System.out.println("单链表 删除 第6个位置数据后,数据分别是:\n"+ lista.toString() );
System.out.println("search链表元素值是:\n" + lista.search("x"));
}
}
==============================================
顺序栈
package package1;
public class SeqStack
{
private static final int MAXSIZE = 100;
private int top;
private String[] data;
SeqStack()
{
Init_SeqStack(MAXSIZE);
}
private void Init_SeqStack(int size)
{
data = new String[size];
top = -1;
}
public int Empty_SeqStack()
{
if (top == -1)
return 1;
else
return 0;
}
public int Full_SeqStack()
{
if (top == MAXSIZE - 1)
return 1;
else
return 0;
}
public int Push_SeqStack(String x)
{
if (Full_SeqStack() == 1)
return 0;
else
{
top++;
data[top] = x;
return 1;
}
}
public String Pop_SeqStack()
{
if (Empty_SeqStack() == 1)
return null;
else
return data[top--];
}
public String Top_SeqStack()
{
if (Empty_SeqStack() == 1)
return null;
else
return data[top];
}
}
===========下列转载的文章,谢谢合作!知识共享!
http://blog.csdn.net/yaoweijq/article/details/7183937 Java中栈的最大递归深度http://blog.chinaunix.net/uid-20384806-id-1954176.html 递归的本质:使用 栈 来实现,
http://blog.csdn.net/jiutianhe/article/details/18605999
===========
二叉树
递归 全排列:
123 213 231 321 312 132
===========
二叉树
案例一:
package com.cxl.algorithm;
// 二叉树接口的ADT
public interface IBiTree
{
}
---------------------------
package com.cxl.algorithm;
// 二叉树的 链式 结点 的结构
public class LinkBiTNode
{
public int data;
public LinkBiTNode lchild;
public LinkBiTNode rchild;
public void LinkBiTNode(LinkBiTNode lchildval, LinkBiTNode rchildval)
{
lchild = lchildval;
rchild = rchildval;
}
public LinkBiTNode(int elem, LinkBiTNode lchildval, LinkBiTNode rchildval)
{
data = elem;
LinkBiTNode(lchildval,rchildval);
}
}
---------------------------------
package com.cxl.algorithm;
public class LinkBiTree implements IBiTree
{
private LinkBiTNode root; // 用于指示二叉树的根节点
public LinkBiTNode getRoot()
{
return root;
}
public void setRoot(LinkBiTNode root)
{
this.root = root;
}
public void insert(int value)
{
LinkBiTNode newNode = new LinkBiTNode(value, null, null);
if (root == null)
{
root = newNode;
} else
{
LinkBiTNode currentNode = root;
LinkBiTNode parentNode;
while (true)
{
parentNode = currentNode;
// 往右放
if (newNode.data > currentNode.data)
{
currentNode = currentNode.rchild;
if (currentNode == null)
{
parentNode.rchild = newNode;
return;
}
} else
{
// 往左放
currentNode = currentNode.lchild;
if (currentNode == null)
{
parentNode.lchild = newNode;
return;
}
}
}
}
}
LinkBiTree()
{
root = null;
}
}
/*
* public LinkBiTree initiate() { // 初始建立一颗带有头节点的二叉树;
*
* LinkBiTNode bt = new LinkBiTNode(null, null);
*
* LinkBiTree T = new LinkBiTree();
*
* T.root = bt;
*
* return T; }
*
* public LinkBiTree create(String x, LinkBiTree lbt, LinkBiTree rbt) { //
* 初始建立一颗以X为根节点的二叉树; LinkBiTree T = new LinkBiTree(); LinkBiTNode bt = new
* LinkBiTNode(x, null, null);
*
* T.root = bt; // T.bt.lchild = lbt; // T.bt.rchild = rbt; return T; }
*
* public LinkBiTree createBiTree(String x, LinkBiTree lbt, LinkBiTree rbt) { //
* 初始建立一颗以X为根节点的二叉树; LinkBiTNode temp = null ; if(root == null) { temp = new
* LinkBiTNode(x,null,null); root = temp ; } else { while(temp) { if( x <
* root.data ) temp = root.lchild ; root = temp ; else temp = root.rchild ; root
* = temp }
*
* }
*
*
*
* LinkBiTree T = new LinkBiTree(); LinkBiTNode bt = new LinkBiTNode(x, null,
* null);
*
* T.root = bt; // T.bt.lchild = lbt; // T.bt.rchild = rbt; return T; }
*
* }
*/
--------------------------------
package com.cxl.algorithm;
public class test {
public static void main(String[] args) {
LinkBiTree tree = new LinkBiTree();
tree.insert(10);
tree.insert(40);
tree.insert(20);
tree.insert(3);
tree.insert(49);
tree.insert(13);
tree.insert(123);
System.out.println("root=" + tree.getRoot().data);
System.out.println("================================ ");
===========
上述案例代码更新:
package package1;
//二叉树的 链式 结点 的结构
public class LinkBiTNode
{
public int data;
public LinkBiTNode lchild;
public LinkBiTNode rchild;
public void LinkBiTNode(LinkBiTNode lchildval, LinkBiTNode rchildval)
{
lchild = lchildval;
rchild = rchildval;
}
public LinkBiTNode(int elem, LinkBiTNode lchildval, LinkBiTNode rchildval)
{
data = elem;
LinkBiTNode(lchildval,rchildval);
}
}
------------------------
package package1;
public class LinkBiTree implements IBiTree
{
//LinkBiTNode p = null;
private LinkBiTNode root; // 用于指示二叉树的根节点
public LinkBiTNode getRoot()
{
return root;
}
public void setRoot(LinkBiTNode root)
{
this.root = root;
}
public void insertLTree(int value)
{
LinkBiTNode newNode = new LinkBiTNode(value, null, null);
if (root == null)
root = newNode;
else
{
LinkBiTNode parentNode = root;
while (parentNode.lchild != null)//找到左叶子结点
{
parentNode = parentNode.lchild;
}
parentNode.lchild = newNode;
}
}
public LinkBiTNode search(LinkBiTNode bt ,int x ) //返回指定元素值得对象内存空间
{
LinkBiTNode p = null;
if( bt != null)
{
if( bt.data == x ) return bt ;
if(bt.lchild != null) p = search(bt.lchild, x);
if(p != null ) return p;
if(bt.rchild != null) p = search(bt.rchild, x);
if(p != null) return p;
}
return null;
}
public int countLeaf( LinkBiTNode bt )//统计二叉树的叶子结点个数
{
if(bt == null) return 0 ;
if(bt.lchild ==null && bt.rchild ==null) return 1;
return ( countLeaf(bt.lchild)+countLeaf(bt.rchild));
}
public void insert(int value)
{
LinkBiTNode newNode = new LinkBiTNode(value, null, null);
if (root == null)
{
root = newNode;
} else
{
LinkBiTNode currentNode = root;
LinkBiTNode parentNode;
while (true)
{
parentNode = currentNode;
// 往右放
if (newNode.data > currentNode.data)
{
currentNode = currentNode.rchild;
if (currentNode == null)
{
parentNode.rchild = newNode;
return;
}
} else
{
// 往左放
currentNode = currentNode.lchild;
if (currentNode == null)
{
parentNode.lchild = newNode;
return;
}
}
}
}
}
LinkBiTree()
{
root = null;
}
public void PreOrder(LinkBiTNode bt)
{
if (bt == null)
return;
System.out.print(bt.data + "-");
PreOrder(bt.lchild);
PreOrder(bt.rchild);
}
}
--------------------------------------
package package1;
// 文档的分割与合并, 基于大文档
public class test {
public static void main(String[] args) {
LinkBiTree tree = new LinkBiTree();
tree.insert(10);
tree.insert(40);
tree.insert(20);
tree.insert(3);
tree.insert(49);
tree.insert(13);
tree.insert(123);
tree.insertLTree(55);
System.out.println("root=" + tree.getRoot().data);
System.out.println("================================ ");
tree.PreOrder(tree.getRoot() );
System.out.println(tree.search(tree.getRoot(), 13));
System.out.println("叶子结点个数是:"+tree.countLeaf(tree.getRoot()));
}
}
========================================================
package queue;
//自己定义的 队列
public class MyQueue
{
private int [] data;//存储元素的 数组空间
private int num;//用于存储队列的元素 当前总的个数
private int front ; // 对头
private int end ; // 对尾
public MyQueue(){
data = new int[10];
num =0;
front =0;
end =-1;
}
/**
* 带参数的构造方法
*/
public MyQueue(int maxsize){
data = new int[maxsize];
num =0;
front =0;
end =-1;
}
// 添加队列元素
public void insert(int value){
data[++end] = value;
num++;
}
public long remove(){
num--;
return data[front++];
}
//查看数据
public long peek(){
return data[front];
}
//判断是否为空
public boolean isEmpty(){
return num == 0 ;
}
public boolean isFull(){
return num == data.length ;
}
}
------------------------------------------------------------
package queue;
public class TestMyQueue
{
public static void main(String[] args)
{
MyQueue myQueue = new MyQueue();
myQueue.insert(100);
myQueue.insert(200);
myQueue.insert(300);
myQueue.insert(400);
myQueue.insert(500);
System.out.println("队列的头元素是:"+myQueue.peek());
System.out.print("队列中的每一个元素是:");
while (!myQueue.isEmpty()) {
System.out.print( myQueue.remove() + " ");
}
System.out.println();
}
}
队列的头元素是:100
队列中的每一个元素是:100 200 300 400 500
==============================================================================
package queue;
//自己定义的 改进后 的 循环 队列
public class MyQueue
{
private int MAXSIZE = 5;
private int[] data;// 存储元素的 数组空间
private int num;// 用于存储队列的元素 当前总的个数
private int front; // 对头
private int end; // 对尾
public MyQueue()
{
data = new int[MAXSIZE];
num = 0;
front = 0;
end = -1;
System.out.println(
"默认队列的信息是:队列的总容量是: " + MAXSIZE + ";\n已经存储的元素个数是: " + num + " ; \n队首指针是:" + front + ";\n队尾指针是:" + end);
}
/**
* 带参数的构造方法
*/
public MyQueue(int maxsize)
{
MAXSIZE = maxsize;
data = new int[maxsize];
num = 0;
front = 0;
end = -1;
System.out.println("自己制定的队列的信息是:队列的总容量是: " + MAXSIZE + ";\n已经存储的元素个数是: " + num + " ; \n队首指针是:" + front
+ ";\n队尾指针是:" + end);
}
// 添加队列元素
public void insert(int value)
{
//if (end == data.length - 1)
//{
// end = -1;
//}
if (num == MAXSIZE)
{
System.out.println("队列已满,无法再插入新元素了!");
} else
{
end = (end + 1) % MAXSIZE;
data[end] = value;
num++;
System.out.println("你往队列中插入了一个新元素:" + value + " ;队列存储的元素个数 是:"+num +" ;front is "+ front +" ; end is :"+ end);
}
}
public long remove()
{
if (num == 0)
{
System.out.print("队列 已空 ,无法再 删除 元素了! 返回的 0 代表的是 空元素---");
return 0;
} else
{
num--;
long i = data[front];
front = (front + 1) % MAXSIZE;
System.out.println("你从队列中 删除了队首 头元素:" + i + " ;队列存储的元素个数 是:"+num +" ;front is "+ front +" ; end is :"+ end +";");
return i;
}
}
// 查看数据
public long peek()
{
System.out.print("队列首元素front指针是:"+front+" ;你 现在 从队列中 查看 队首 头元素:");
return data[front];
}
// 判断是否为空
public boolean isEmpty()
{
// System.out.print("当前队列 包含的元素 是 空的 。");
return num == 0;
}
public boolean isFull()
{
System.out.print("当前队列 包含的元素 是 满的 。");
return num == data.length;
}
}
------------------------------------------------
package queue;
public class TestMyQueue
{
public static void main(String[] args)
{
MyQueue myQueue = new MyQueue();
myQueue.insert(100);
myQueue.insert(200);
myQueue.insert(300);
myQueue.insert(400);
myQueue.insert(500);
myQueue.insert(1500);
System.out.println("队列的头元素是:"+myQueue.peek());
myQueue.remove();
myQueue.remove();
myQueue.remove();
myQueue.insert(1500);
myQueue.insert(1500);
System.out.println("队列中的每一个元素是:");
while (!myQueue.isEmpty()) {
System.out.print( myQueue.remove() + " ");
}
System.out.println();
myQueue.remove();
}
}
-----------------------------------------
默认队列的信息是:队列的总容量是: 5;
已经存储的元素个数是: 0 ;
队首指针是:0;
队尾指针是:-1
你往队列中插入了一个新元素:100 ;队列存储的元素个数 是:1 ;front is 0 ; end is :0
你往队列中插入了一个新元素:200 ;队列存储的元素个数 是:2 ;front is 0 ; end is :1
你往队列中插入了一个新元素:300 ;队列存储的元素个数 是:3 ;front is 0 ; end is :2
你往队列中插入了一个新元素:400 ;队列存储的元素个数 是:4 ;front is 0 ; end is :3
你往队列中插入了一个新元素:500 ;队列存储的元素个数 是:5 ;front is 0 ; end is :4
队列已满,无法再插入新元素了!
队列首元素front指针是:0 ;你 现在 从队列中 查看 队首 头元素:队列的头元素是:100
你从队列中 删除了队首 头元素:100 ;队列存储的元素个数 是:4 ;front is 1 ; end is :4;
你从队列中 删除了队首 头元素:200 ;队列存储的元素个数 是:3 ;front is 2 ; end is :4;
你从队列中 删除了队首 头元素:300 ;队列存储的元素个数 是:2 ;front is 3 ; end is :4;
你往队列中插入了一个新元素:1500 ;队列存储的元素个数 是:3 ;front is 3 ; end is :0
你往队列中插入了一个新元素:1500 ;队列存储的元素个数 是:4 ;front is 3 ; end is :1
队列中的每一个元素是:
你从队列中 删除了队首 头元素:400 ;队列存储的元素个数 是:3 ;front is 4 ; end is :1;
400 你从队列中 删除了队首 头元素:500 ;队列存储的元素个数 是:2 ;front is 0 ; end is :1;
500 你从队列中 删除了队首 头元素:1500 ;队列存储的元素个数 是:1 ;front is 1 ; end is :1;
1500 你从队列中 删除了队首 头元素:1500 ;队列存储的元素个数 是:0 ;front is 2 ; end is :1;
1500
队列 已空 ,无法再 删除 元素了! 返回的 0 代表的是 空元素---
====================