说了那么多废话,该谈谈技术了

本文深入探讨了Java中的容器概念,包括数组的特点与限制,以及各种集合类如List、Set、Map的特点与应用场景。对比了不同容器之间的优缺点,并介绍了实现这些容器的具体类。

1,深深体会Java容器的定义,这部分内容的重要性不亚于类、接口和继承等那部分知识。

 

2,数组的长度是确定的,在定义时就已经确定了。数组定义的几种方式:(1),int [] abc;abc=new int[3];

                                                                                                                  (2),int []abc=new int[4];

                                                                                                                  (3),int [] abc={1,2,3,4,5}

                                                                                                                  (4),给数组自动分配值abc[0]=100

    缺点就是你要是动态改变容器的大小不太好控制,也没有自动过滤到重复的数据功能,也没有存取键值对的功能。

 

3,

接口

实现

历史集合类

Set

HashSet

 

 

TreeSet

 

List

ArrayList

Vector

 

LinkedList

Stack

Map

HashMap

Hashtable

 

TreeMap

Properties

set list可以继承collection接口

Map是个单独的概念。

 

4,list最大的特点是能够自动的根据插入的数据量来动态改变容器的大小。

     map最大的特点是能够已键值对的形式存在,往往内存存取数据的最大选择。

     comparable进行列表排序,与数据库进行排序,互有利弊。

    set接口最大的特点是没有重复数据的存在,这样方便进行数据的过滤。

 

 

### C语言实现顺序存储二叉树的前序、中序和后序遍历非递归算法 以下为基于顺序存储二叉树的前序、中序和后序遍历的非递归算法实现。这些算法通过栈来模拟递归调用的过程,确保了遍历的正确性和效率。 --- #### 前序遍历(根 -> 左 -> 右) 前序遍历的核心思想是先访问根节点,然后依次访问左子树和右子树。使用栈来模拟递归调用的过程。 ```c void PreOrder(BinaryTree tree) { if (tree == NULL || tree->size == 0) return; int stack[100]; // 栈用于存储节点索引 int top = -1; // 栈顶指针 int current = 1; // 从根节点开始 while (current != 0 || top != -1) { while (current != 0 && current <= tree->size && tree->data[current] != NIL) { printf("%c", tree->data[current]); // 访问根节点 stack[++top] = current; // 当前节点入栈 current = 2 * current; // 移动到左子节点 } if (top != -1) { current = stack[top--]; // 弹出栈顶元素 current = current * 2 + 1; // 移动到右子节点 } } } ``` --- #### 中序遍历(左 -> 根 -> 右) 中序遍历的核心思想是先访问左子树,然后访问根节点,最后访问右子树。同样使用栈来模拟递归调用的过程。 ```c void InOrder(BinaryTree tree) { if (tree == NULL || tree->size == 0) return; int stack[100]; // 栈用于存储节点索引 int top = -1; // 栈顶指针 int current = 1; // 从根节点开始 while (current != 0 || top != -1) { while (current != 0 && current <= tree->size && tree->data[current] != NIL) { stack[++top] = current; // 当前节点入栈 current = 2 * current; // 移动到左子节点 } if (top != -1) { current = stack[top--]; // 弹出栈顶元素 printf("%c", tree->data[current]); // 访问根节点 current = current * 2 + 1; // 移动到右子节点 } } } ``` --- #### 后序遍历(左 -> 右 -> 根) 后序遍历的核心思想是先访问左子树,然后访问右子树,最后访问根节点。由于需要两次访问根节点,因此使用一个标记变量或双栈法来实现。 ```c void PostOrder(BinaryTree tree) { if (tree == NULL || tree->size == 0) return; int stack1[100], stack2[100]; // 使用两个栈 int top1 = -1, top2 = -1; int current = 1; // 从根节点开始 stack1[++top1] = current; // 根节点入栈 while (top1 != -1) { current = stack1[top1--]; // 弹出栈1的元素 stack2[++top2] = current; // 将弹出的元素压入栈2 if (current * 2 <= tree->size && tree->data[current * 2] != NIL) { stack1[++top1] = current * 2; // 右子节点入栈 } if (current * 2 + 1 <= tree->size && tree->data[current * 2 + 1] != NIL) { stack1[++top1] = current * 2 + 1; // 左子节点入栈 } } while (top2 != -1) { current = stack2[top2--]; // 弹出栈2的元素并访问 printf("%c", tree->data[current]); } } ``` --- ### 示例代码测试 假设输入的顺序存储二叉树为 `ABC-DE------F`,即: ``` A / \ B E / \ \ C D F ``` 运行上述函数可以得到以下结果: - 前序遍历:`ABDCEF` - 中序遍历:`BDAEFC` - 后序遍历:`DBFECA` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值