Hàng đi

Một phần của tài liệu Lập trình hướng đối tượng Java PTIT (Trang 85)

Hàng đ i (queue) có các thu c tính c c b : • M ng các giá tr trong hàng đ i Các thao tác v i hàng đ i:

• Thêm vào m t nút vào cu i hàng đ i • L y ra m t nút t đ u hàng đ i Ch ng trình 5.3 cài đ t l p hàng đ i.

Ch ng trình 5.3

package vidu.chuong5; public class MyQueu{

private Node[] values;

/* Các ph ng th c kh i d ng */ public MyQueu(){}

public MyQueu(Node[] values){ this.values = values; }

/* Ph ng th c l y ra m t node t đ u queu */ public Node remove(){

Node result = null;

if((values != null)&&(values.length > 0)){ result = values[0];

// Lo i b node đ u hàng đ i

Node[] tmpNode = new Node[values.length - 1]; for(int i=0; i<values.length – 1; i++)

tmpNode[i] = values[i+1]; this.values = tmpNode;

}

return result; }

/* Ph ng th c thêm m t node vào cu i queu */ public void insert(Node node){

if(values == null){ // Hàng đ i đang r ng values = new Node[1];

values[0] = node;

}else{ // Hàng đ i đã có d li u

Node[] tmpNode = new Node[values.length + 1]; for(int i=0; i<values.length; i++)

tmpNode[i] = values[i]; tmpNode[values.length] = node; this.values = tmpNode; } } } 5.4 DANH SÁCH LIÊN K T

N i dung ph n này t p trung cài đ t hai lo i danh sách liên k t c b n: • Danh sách liên k t đ n

• Danh sách liên k t kép

5.4.1 Danh sách liên k t đ n

nh ngh a m t nút c a danh sách liên k t đ n

M t nút c a danh sách liên k t đ n bao g m:

• Giá tr c a nút, có d ng là m t đ i t ng ki u Node đã đ c đnh ngh a trong ch ng trình 5.2a

• Nút ti p theo c a nút đó.

M t nút c a danh sách liên k t đ n đ c cài đ t trong ch ng trình 5.4a.

Ch ng trình 5.4a

package vidu.chuong5; public class SimpleNode{

private Node value; // Giá tr c a node là m t đ i t ng ki u Node private SimpleNode next; // Node ti p theo c a danh sách liên k t

/* Các ph ng th c kh i d ng */ public SimpleNode(){

value = new Node(); next = null;

}

public SimpleNode(Node value){ this.value = value;

next = null; }

/* Ph ng th c truy nh p thu c tính value */ public Node getValue(){

return value; }

public void setValue(Node value){ this.value = value;

}

/* Ph ng th c truy nh p thu c tính next */ public SimpleNode getNext(){

return next; }

public void setNext(SimpleNode next){ this.next = next;

} }

nh ngh a đnh tiêu đ c a danh sách liên k t đ n

nh tiêu đ c a danh sách liên k t đ n là m t đ i t ng khác v i m t nút thông th ng c a danh sách. i t ng này l u các thông tin:

• Ch đ n nút th c s đ u tiên c a danh sách • Ch đ n nút cu i cùng c a danh sách

• L u gi s l ng nút th c s trong danh sách. Ch ng trình 5.4b cài đ t l p đnh tiêu đ c a danh sách.

Ch ng trình 5.4b

package vidu.chuong5;

public class HeaderSimpleNode{ private int nodeNumber; private SimpleNode header; private SimpleNode tailer;

/* Ph ng th c kh i d ng */ public HeaderSimpleNode(){ nodeNumber = 0; header = null; tailer = null; }

/* Ph ng th c truy nh p thu c tính nodeNumber */ public int getNodeNumber(){

return nodeNumber; }

public void setNodeNumber(int nodeNumber){ this.nodeNumber = nodeNumber;

}

/* Ph ng th c truy nh p thu c tính header */ public SimpleNode getHeader(){

return header; }

public void setHeader(SimpleNode header){ this.header = header;

}

/* Ph ng th c truy nh p thu c tính tailer */ public SimpleNode getTailer(){

return tailer; }

public void setTailer(SimpleNode tailer){ this.tailer = tailer;

} }

Cài đ t danh sách liên k t đ n

Danh sách liên k t đ n có thu c tính c c b là m t đ i t ng ki u HeaderSimpleNode. Và có các thao tác chính:

• Thêm m t ph n t vào m t v trí b t kì: n u v trí nh h n 0, thêm vào đ u danh sách. N u v trí l n h n đ dài danh sách, thêm vào cu i. Tr ng h p còn l i, chèn vào danh sách m t cách bình th ng.

• Lo i b m t ph n t v trí b t kì: Ch lo i b khi v trí ch ra n m trong ph m vi đ dài danh sách. Ph ng th c này tr v nút b lo i b , có ki u SimpleNode.

• Duy t toàn b danh sách: Tr v giá tr c a t t c các ph n t có trong danh sách. Giá tr tr v là m t m ng các ph n t giá tr có ki u Node.

Ch ng trình 5.4c cài đ t l p danh sách liên k t đ n.

Ch ng trình 5.4c

package vidu.chuong5; public class SimpleList{

private HeaderSimpleNode myList;

/* Các ph ng th c kh i d ng */ public SimpleList(){

myList = new HeaderSimpleNode(); }

/* Ph ng th c chèn thêm m t node vào v trí @position */ public void insert(Node value, int position){

// T o m t node m i

SimpleNode newNode = new SimpleNode(value); if(position <= 0){ // Chèn vào đ u

newNode.setNext(myList.getHeader()); myList.setHeader(newNode);

if(myList.getNodeNumber() == 0) // Danh sách ban đ u r ng myList.setTailer(newNode);

}else if(position >= myList.getNodeNumber()){ // Chèn vào cu i if(myList.getNodeNumber() == 0){ // Danh sách ban đ u r ng myList.setHeader(newNode);

myList.setTailer(newNode); }else{ // Danh sách không r ng

myList.getTailer().setNext(newNode); myList.setTailer(newNode);

}

}else{ // Chèn vào gi a int index = 0;

SimpleNode prev = null;

SimpleNode current = myList.getHeader(); while(index < position){ index++; prev = current; current = current.getNext(); } newNode.setNext(current); prev.setNext(newNode); } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() + 1); } /* Ph ng th c lo i b m t node v trí @position */ public SimpleNode remove(int position){

if((myList.getNodeNumber() == 0)||

(position < 0)||(position >= myList.getNodeNumber())) return null;

SimpleNode result = null;

if(position == 0){ // Lo i ph n t đ u result = myList.getHeader();

if(myList.getNodeNumber() == 1) // Danh sách ch có 1 ph n t myList.setTailer(null);

}else if(position==myList.getNodeNumber()-1){ // Lo i ph n t cu i result = myList.getTailer();

SimpleNode current = myList.getHeader();

while(!current.getNext().equals(myList.getTailer())) current = current.getNext(); current.setNext(null); myList.setTailer(current); }else{ // Lo i ph n t n m gi a danh sách int index = 0;

SimpleNode prev = null;

SimpleNode current = myList.getHeader(); while(index < position){ index++; prev = current; current = current.getNext(); } prev.setNext(current.getNext()); result = current; } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() - 1); result.setNext(null); return result; }

/* Ph ng th c duy t toàn b danh sách */ public Node[] travese(){

// Danh sách r ng

if(myList.getNodeNumber() == 0) return null;

// Danh sách không r ng

Node[] result = new Node[myList.getNodeNumber()]; SimpleNode current = myList.getHeader();

int index = 0;

while(current != null){

result[index] = current.getValue(); index++;

} return result; } } 5.4.2 Danh sách liên k t kép nh ngh a m t nút c a danh sách liên k t kép

M t nút c a danh sách liên k t kép bao g m:

• Giá tr c a nút, có d ng là m t đ i t ng ki u Node đã đ c đnh ngh a trong ch ng trình 5.2a

• Nút ti p theo c a nút đó. • Nút tr c c a nút đó.

M t nút c a danh sách liên k t kép đ c cài đ t trong ch ng trình 5.5a.

Ch ng trình 5.5a

package vidu.chuong5; public class DoubleNode{

private Node value; private DoubleNode prev; private DoubleNode next;

/* Các ph ng th c kh i d ng */ public DoubleNode(){

value = new Node(); prev = null;

next = null; }

public DoubleNode(Node value){ this.value = value;

prev = null; next = null; }

/* Ph ng th c truy nh p thu c tính value */ public Node getValue(){

return value; }

public void setValue(Node value){ this.value = value;

}

public DoubleNode getNext(){ return next;

}

public void setNext(DoubleNode next){ this.next = next;

}

/* Ph ng th c truy nh p thu c tính prev */ public DoubleNode getPrev(){

return prev; }

public void setPrev(DoubleNode prev){ this.prev = prev;

} }

nh ngh a đnh tiêu đ c a danh sách liên k t kép

nh tiêu đ c a danh sách liên k t đ n là m t đ i t ng khác v i m t nút thông th ng c a danh sách. i t ng này l u các thông tin:

• Ch đ n nút th c s đ u tiên c a danh sách • Ch đ n nút cu i cùng c a danh sách

• L u gi s l ng nút th c s trong danh sách. Ch ng trình 5.5b cài đ t l p đnh tiêu đ c a danh sách.

Ch ng trình 5.5b

package vidu.chuong5;

public class HeaderDoubleNode{ private int nodeNumber; private DoubleNode header; private DoubleNode tailer;

/* Ph ng th c kh i d ng */ public HeaderDoubleNode(){ nodeNumber = 0; header = null; tailer = null; }

/* Ph ng th c truy nh p thu c tính nodeNumber */ public int getNodeNumber(){

}

public void setNodeNumber(int nodeNumber){ this.nodeNumber = nodeNumber;

}

/* Ph ng th c truy nh p thu c tính header */ public DoubleNode getHeader(){

return header; }

public void setHeader(DoubleNode header){ this.header = header;

}

/* Ph ng th c truy nh p thu c tính tailer */ public DoubleNode getTailer(){

return tailer; }

public void setTailer(DoubleNode tailer){ this.tailer = tailer;

} }

Cài đ t danh sách liên k t kép

Danh sách liên k t kép có thu c tính c c b là m đ i t ng ki u HeaderDoubleNode. Và có các thao tác chính:

• Thêm m t ph n t vào m t v trí b t kì: n u v trí nh h n 0, thêm vào đ u danh sách. N u v trí l n h n đ dài danh sách, thêm vào cu i. Tr ng h p còn l i, chèn vào danh sách m t cách bình th ng.

• Lo i b m t ph n t v trí b t kì: Ch lo i b khi v trí ch ra n m trong ph m vi đ dài danh sách. Ph ng th c này tr v nút b lo i b , có ki u DoubleNode.

• Duy t toàn b danh sách: Tr v giá tr c a t t c các ph n t có trong danh sách. Giá tr tr v là m t m ng các ph n t giá tr có ki u Node.

Ch ng trình 5.5c cài đ t l p danh sách liên k t kép.

Ch ng trình 5.5c

package vidu.chuong5; public class DoubleList{

private HeaderDoubleNode myList;

/* Các ph ng th c kh i d ng */ public DoubleList(){

myList = new HeaderDoubleNode(); }

/* Ph ng th c chèn thêm m t node vào v trí @position */ public void insert(Node value, int position){

// T o m t node m i

DoubleNode newNode = new DoubleNode(value); if(position <= 0){ // Chèn vào đ u

newNode.setNext(myList.getHeader()); myList.getHeader().setPrev(newNode); myList.setHeader(newNode);

if(myList.getNodeNumber() == 0) // Danh sách ban đ u r ng myList.setTailer(newNode);

}else if(position >= myList.getNodeNumber()){ // Chèn vào cu i if(myList.getNodeNumber() == 0){ // Danh sách ban đ u r ng myList.setHeader(newNode);

myList.setTailer(newNode); }else{ // Danh sách không r ng

newNode.setPrev(myList.getTailer()); myList.getTailer().setNext(newNode); myList.setTailer(newNode); } }else{ // Chèn vào gi a int index = 0;

DoubleNode current = myList.getHeader(); while(index < position){ index++; current = current.getNext(); } newNode.setNext(current); newNode.setPrev(current.getPrev()); current.getPrev().setNext(newNode); current.setPrev(newNode); } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() + 1); } /* Ph ng th c lo i b m t node v trí @position */ public DoubleNode remove(int position){

if((myList.getNodeNumber() == 0)||

(position < 0)||(position >= myList.getNodeNumber())) return null;

DoubleNode result = null; if(position == 0){ // Lo i ph n t đ u result = myList.getHeader(); myList.setHeader(myList.getHeader().getNext()); if(myList.getHeader() != null) myList.getHeader().setPrev(null); if(myList.getNodeNumber() == 1) // Danh sách ch có 1 ph n t myList.setTailer(null); }else if(position==myList.getNodeNumber()-1){ // Lo i ph n t cu i result = myList.getTailer(); myList.setTailer(myList.getTailer().getPrev()); myList.getTailer().setNext(null); }else{ // Lo i ph n t n m gi a danh sách int index = 0;

DoubleNode current = myList.getHeader(); while(index < position){ index++; current = current.getNext(); } current.getPrev().setNext(current.getNext()); current.getNext().setPrev(current.getPrev()); result = current; } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() - 1); result.setPrev(null); result.setNext(null); return result; }

/* Ph ng th c duy t toàn b danh sách */ public Node[] travese(){

// Danh sách r ng

if(myList.getNodeNumber() == 0) return null;

// Danh sách không r ng

Node[] result = new Node[myList.getNodeNumber()]; DoubleNode current = myList.getHeader();

int index = 0; while(current != null){ result[index] = current.getValue(); index++; current = current.getNext(); } return result; } } 5.5 CÂY NH PHÂN

Cài đ t nút c a cây nh phân

M t nút c a cây nh phân có các thu c tính sau: • Giá tr c a nút là m t đ i t ng ki u Node • Ch đ n nút con bên trái c a nó.

• Ch đ n nút con bên ph i c a nó.

Ch ng trình 5.6a cài đ t m t nút c a cây nh phân.

Ch ng trình 5.6a

package vidu.chuong5;

public class BinaryTreeNode{ private Node value;

private BinaryTreeNode left; private BinaryTreeNode right;

/* Các ph ng th c kh i d ng */ public BinaryTreeNode(){

value = new Node(); left = null;

right = null; }

public BinaryTreeNode(Node value){ this.value = value;

left = null; right = null; }

/* Ph ng th c truy nh p thu c tính value */ public Node getValue(){

return value; }

public void setValue(Node value){ this.value = value;

}

/* Ph ng th c truy nh p thu c tính left */ public BinaryTreeNode getLeft(){

return left; }

public void setLeft(BinaryTreeNode left){ this.left = left;

}

/* Ph ng th c truy nh p thu c tính right */ public BinaryTreeNode getRight(){

return right; }

public void setRight(BinaryTreeNode right){ this.right = right;

} }

Cài đ t cây nh phân

V i cây nh phân, ta ch c n l u gi m t bi n c c b là nút g c c a cây. Khi đó, ta c n đ n các thao tác c b n trên cây nh phân nh sau:

• Tìm m t nút có giá tr (ho c là khoá) xác đnh • Thêm nút con trái c a m t nút

• Thêm nút con ph i c a m t nút • Xoá nút con trái c a m t nút • Xoá nút con ph i c a m t nút • Duy t cây theo th t tr c • Duy t cây theo th t gi a • Duy t cây theo th t sau

Ch ng trình 5.6b cài đ t l p cây nh phân.

Ch ng trình 5.6b

package vidu.chuong5; public class BinaryTree{

private BinaryTreeNode root;

public BinaryTree(){ root = null;

}

public BinaryTree(Node value){

root = new BinaryTreeNode(value); }

/* Ph ng th c tr v node có giá tr @value */ public BinaryTreeNode getNode(Node value){

return searchNode(root, value); }

/* Ph ng th c tìm ki m đ qui m t node có giá tr @value trên m t cây con có g c là @treeNode */

private BinaryTreeNode searchNode(BinaryTreeNode treeNode, Node value){

if(treeNode.getValue().equals(value)) return treeNode;

if(treeNode == null) return null;

BinaryTreeNode result = null; // Tìm trên nhánh con bên trái

result = searchNode(treeNode.getLeft(), value); // Tìm trên nhánh con bên ph i

if(result == null)

result = searchNode(treeNode.getRight(), value); return result;

}

/* Ph ng th c thêm node con bên trái c a node @treeNode */ public boolean insertLeft(BinaryTreeNode treeNode, Node value){

if((treeNode == null)||(treeNode.getLeft() != null)) return false;

BinaryTreeNode newNode = new BinaryTreeNode(value); treeNode.setLeft(newNode);

return true; }

/* Ph ng th c thêm node con bên ph i c a node @treeNode */ public boolean insertRight(BinaryTreeNode treeNode, Node value){

if((treeNode == null)||(treeNode.getRight() != null)) return false;

treeNode.setRight(newNode); return true;

}

/* Ph ng th c xóa node con bên trái c a node @treeNode */ public boolean removeLeft(BinaryTreeNode treeNode){

// Node hi n t i r ng if(treeNode == null)

return false;

// Node con trái không ph i là node lá if((treeNode.getLeft() != null)&& ((treeNode.getLeft().getLeft() != null)|| (treeNode.getLeft().getRight() != null))) return false; treeNode.setLeft(null); return true; }

/* Ph ng th c xoá node con bên ph i c a node @treeNode */ public boolean removeRight(BinaryTreeNode treeNode){

// Node hi n t i r ng if(treeNode == null)

return false;

// Node con ph i không ph i là node lá if((treeNode.getRight() != null)&& ((treeNode.getRight().getLeft() != null)|| (treeNode.getRight().getRight() != null))) return false; treeNode.setRight(null); return true; }

/* Ph ng th c duy t cây theo th t tr c */ public Node[] preTravese(){

Node[] result = null; preOrder(root, result); return result;

}

/* Ph ng th c duy t cây con @treeNode theo th t tr c và k t qu tr v n m trong @result */

private void preOrder(BinaryTreeNode treeNode, Node[] result){ if(treeNode != null){

addNode(result, treeNode.getValue()); preOrder(treeNode.getLeft(), result); preOrder(treeNode.getRight(), result); }

}

/* Ph ng th c thêm m t @node vào cu i m t danh sách các @nodes*/ private void addNode(Node[] nodes, Node node){

if(nodes == null){// Danh sách ban đ u r ng nodes = new Node[1];

nodes[0] = node; return;

}

Node[] tmpNodes = new Node[nodes.length + 1]; for(int i=0; i<nodes.length; i++)

tmpNodes[i] = nodes[i]; tmpNodes[nodes.length] = node; nodes = tmpNodes;

}

/* Ph ng th c duy t cây theo th t gi a */ public Node[] inTravese(){

Node[] result = null; inOrder(root, result); return result;

}

/* Ph ng th c duy t cây con @treeNode theo th t gi a và k t qu tr v n m trong @result */

private void inOrder(BinaryTreeNode treeNode, Node[] result){

Một phần của tài liệu Lập trình hướng đối tượng Java PTIT (Trang 85)

Tải bản đầy đủ (PDF)

(173 trang)