Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...
本文實例講述了java數據結構之鏈表、棧、隊列、樹的實現方法。分享給大家供大家參考,具體如下:
最近無意中翻到一本書,閑來無事寫幾行代碼,實現幾種常用的數據結構,以備后查。
一、線性表(鏈表)
1、節點定義
/**鏈表節點定義
* @author colonel
*
*/
class node {
public int data;
node next=null;
public node(int data){
this.data=data;
}
}
2、鏈表操作類
/**鏈表操作類
* @author colonel
*
*/
public class operateclass {
public node headnode=null;
/*給鏈表添加界節點
* @param data 鏈表節點數據
*/
public node addnode(int data){
node newnode=new node(data);
if (headnode==null) {
headnode=newnode;
newnode.next=null;
return headnode;
}
node tempnode=headnode;
while (tempnode.next!=null) {
//tempnode=headnode;
tempnode=tempnode.next;
}
tempnode.next=newnode;
return headnode;
}
/**刪除節點
* @param 刪除節點的位置
*
*/
public boolean delnode(int index){
if (index<1||index>length()) {
return false;
}
if (index==1) {
headnode=headnode.next;
return true;
}
node prenode=headnode;
node curnode=prenode.next;
int count=2;
while (curnode!=null) {
if (count==index) {
prenode.next=curnode.next;
return true;
}
prenode=curnode;
curnode=curnode.next;
count++;
}
return true;
}
/**取鏈表的長度
* @return返回鏈表的長度
*/
public int length(){
int length=0;
node temp=headnode;
while (temp!=null) {
length++;
temp=temp.next;
}
return length;
}
/**按照值域對鏈表數據排序
* @return 返回排序后的鏈表頭節點
*/
public node orderlist(){
node nextnode=null;
int temp=0;
node curnode=headnode;
while (curnode.next!=null) {
nextnode=curnode.next;
while (nextnode!=null) {
if (curnode.data>nextnode.data) {
temp=curnode.data;
curnode.data=nextnode.data;
nextnode.data=temp;
}
nextnode=nextnode.next;
}
curnode=curnode.next;
}
return headnode;
}
/**
* 去除鏈表中值域重復的元素
*/
public void redrepeat(){
if (length()<=1) {
return;
}
node curnode=headnode;
while (curnode!=null) {
node insidnode=curnode.next;
node insidprenode=insidnode;
while (insidnode!=null) {
if (insidnode.data==curnode.data) {
insidprenode.next=insidnode.next;
//return;
}
insidprenode=insidnode;
insidnode=insidnode.next;
}
curnode=curnode.next;
}
}
/**倒序輸出鏈表中所有的數據
* @param hnode 鏈表頭節點
*/
public void reverseprint(node hnode){
if (hnode!=null) {
reverseprint(hnode.next);
system.out.println(hnode.data);
}
}
/**
* 從頭節點開始到為節點結尾打印出值
*/
public void printlist(){
node tmpnode=headnode;
while (tmpnode!=null) {
system.out.println(tmpnode.data);
tmpnode=tmpnode.next;
}
}
}
二、棧
1、該棧使用數組實現,具體的棧操作類
class mystack{
private object[] stack;
int top=-1;
public mystack(){
stack=new object[10];
}
public boolean isempty(){
return top==0;
}
/**彈出棧頂元素(不刪除)
* @return
*/
public e peek(){
if (isempty()) {
return null;
}
return (e) stack[top];
}
/**出棧站頂元素
* @return 棧頂元素
*/
public e pop(){
e e=peek();
stack[top]=null;
top--;
return e;
}
/**壓棧
* @param item 待壓元素
* @return 返回待壓元素
*/
public e push(e item){
//ensurecapacity(top+1);
stack[++top]=item;
return item;
}
/**棧滿擴容
* @param size
*/
public void ensurecapacity(int size){
int len=stack.length;
if (size>len) {
int newlen=10;
stack=arrays.copyof(stack, newlen);
}
}
/**返回棧頂元素
* @return
*/
public e gettop(){
if (top==-1) {
return null;
}
return (e) stack[top];
}
}
三、隊列
該隊列使用鏈式實現
1、隊節點定義
/**
* @author colonel
*隊節點定義
* @param
*/
class queuenode{
queuenode nextnode=null;
elem data;
public queuenode(elem data){
this.data=data;
}
}
2、隊列操作類
/**
* @author colonel
*隊列操作類
* @param
*/
class myqueue{
private queuenode headnode=null;
private queuenode tailnode=null;
private queuenode lastnode=null;
/**判斷該隊列是否為空
* @return 返回true or false
*/
public boolean isempty(){
return headnode==tailnode;
}
/**入隊操作
* @param data 節點元素值
*/
public void put(elem data){
queuenode newnode=new queuenode(data);
if (headnode==null&&tailnode==null) {
headnode=tailnode=newnode;
//tailnode=headnode.nextnode;
lastnode=tailnode.nextnode;
return;
}
tailnode.nextnode=newnode;
tailnode=newnode;
lastnode=tailnode.nextnode;
//tailnode=tailnode.nextnode;
}
/**出隊操作
* @return 返回出隊元素
*/
public elem pop(){
if (headnode==lastnode) {
return null;
}
queuenode tempnode=headnode;
elem statelem=tempnode.data;
headnode=tempnode.nextnode;
return statelem;
}
/**返回隊列長度
* @return 長度
*/
public int size(){
if (isempty()) {
return 0;
}
int length=0;
queuenode temp=headnode;
while (temp!=null) {
length++;
temp=temp.nextnode;
}
return length;
}
}
四、二叉樹
1、節點定義
/**樹節點定義
* @author colonel
*
*/
class treenode{
public int data;
public treenode leftnode;
public treenode rightnode;
public treenode(int data){
this.data=data;
this.leftnode=null;
this.rightnode=null;
}
}
2、二叉樹操作類
/**二叉排序樹操作類
* @author colonel
*
*/
class operatetree{
public treenode rootnode;
public operatetree(){
rootnode=null;
}
/**元素插入二叉排序樹
* @param data 待插節點數據
*/
public void insert(int data){
treenode newnode=new treenode(data);
if (rootnode==null) {
rootnode=newnode;
}else {
treenode current=rootnode;
treenode parent;
while (true) {
parent=current;
if (data
current=current.leftnode;
if (current==null) {
parent.leftnode=newnode;
return;
}
} else {
current=current.rightnode;
if (current==null) {
parent.rightnode=newnode;
return;
}
}
}
}
}
/**構建二叉排序樹
* @param item 元素數組
*/
public void buildtree(int[] item){
for (int i = 0; i < item.length; i++) {
insert(item[i]);
}
}
/**
* 先序遍歷二叉樹
*/
public void preorder(treenode root){
if (root!=null) {
system.out.println(root.data);
preorder(root.leftnode);
preorder(root.rightnode);
}
}
/**中序遍歷
* @param root
*/
public void inorder(treenode root){
if (root!=null) {
inorder(root.leftnode);
system.out.println(root.data);
inorder(root.rightnode);
}
}
/**后序遍歷
* @param root
*/
public void afterorder(treenode root){
if (root!=null) {
afterorder(root.leftnode);
afterorder(root.rightnode);
system.out.println(root.data);
}
}
/**
* 層序遍歷二叉排序樹
*/
public void layertrave(){
if (this.rootnode==null) {
return;
}
queue myqueue=new linkedlist<>();
myqueue.add(rootnode);
while (!myqueue.isempty()) {
treenode tempnode=myqueue.poll();
system.out.println(tempnode.data);
if (tempnode.leftnode!=null) {
myqueue.add(tempnode.leftnode);
}
if (tempnode.rightnode!=null) {
myqueue.add(tempnode.rightnode);
}
}
}
五、總結
更好的理解數據結構為何物,還需繼續探索,謹記。by:colonel
希望本文所述對大家java程序設計有所幫助。
希望與廣大網友互動??
點此進行留言吧!
總結
以上是生活随笔為你收集整理的Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java构造字符缓冲区_java学习笔记
- 下一篇: duck typing java_编程语