结点类
package ch06;
public class Node {
private Object data; // 存放结点值 private Node next; // 后继结点的引用 // 无参数时的构造函数 public Node() { this(null, null); }
//带一个参数时的构造函数 public Node(Object data) { // 构造值为data的结点 this(data, null); }
//带两个参数时的构造函数 public Node(Object data, Node next) { this.data = data; this.next = next; }
public Object getData() { return data; }
public void setData(Object data) { this.data = data; }
public Node getNext() { return next; }
public void setNext(Node next) { this.next = next; } }
栈的抽象接口类 package ch06;
public interface IStack { public void clear(); public boolean isEmpty(); public int length(); public Object peek(); public void push(Object x) throws Exception; public Object pop(); }
链栈类
package ch06; import ch06.Node;
public class LinkStack implements IStack{ private Node top; //栈顶元素的应用 //将栈置空 public void clear(){ top=null; }
//判断栈是否为空 public boolean isEmpty(){ return top == null; }
//求链栈的长度 public int length(){ Node p = top; int length = 0; while (p!=null){ p=p.getNext(); ++length; } return length; }
//取栈顶元素并返回其值 public Object peek(){ if(!isEmpty()) return top.getData(); else return null; }
//入栈 public void push(Object x){ Node p = new Node(x); p.setNext(top); top = p; }
//出栈 public Object pop(){ if(isEmpty()){ return null; } else{ Node p = top; top = top.getNext(); return p.getData(); } }
//初始化,p指向栈顶元素,length为计数器//从栈顶元素开始向后查找,直到p指向空 // p指向后继结点 //长度增加1 //栈非空 //返回栈顶元素的值 //构造一个新结点 //新结点成为当前的首结点 //p指向被删除的结点(栈顶结点) //修改链指针,使栈顶结点从链栈中移去 //返回栈顶结点的数据域的值
//输出栈中所有数据元素(从栈顶元素到栈底元素) public void display(){ Node p = top; //初始化,p指向栈顶元素 while (p!= null){ //输出所有非空结点的数据元素值 System.out.print((p.getData().toString() + \"\")); p=p.getNext(); //p指针向后移 } } }
队列的抽象接口类 package ch06;
public interface IQueue { public void clear();
public boolean isEmpty(); public int length(); public Object peek();
public void offer(Object x)throws Exception; public Object poll(); }
链队列类 package ch06; import ch06.Node;
public class LinkQueue implements IQueue{ private Node front; private Node rear; //链队列类的构造函数 public LinkQueue(){ front=rear=null; }
//队列置空 public void clear(){ front=rear=null; }
//队列判空 public boolean isEmpty(){ return front==null; }
//求队列的长度 public int length(){ if(!isEmpty()){ Node p=front; int length=0; while(p!=null){ p=p.getNext();
//队首指针 //队尾指针 //队列非空 //指针下移
++length; //计数器+1 } } return length(); }
//取队首元素
public Object peek(){ if(front!=null) //队列非空 return front.getData(); //返回队首结点的数据域值 else return null; }
//入队
public void offer(Object x){ Node p =new Node(x); if(front!=null){ rear.setNext(p); rear=p; } else front=rear=p; }
//出队
public Object poll(){ if(front !=null){ Node p=front; front=front.getNext(); if(p==rear) rear=null; return p.getData(); } else return null;
} }
顶点结点类 package ch06;
public class VNode { private Object data; private ArcNode firstArc; public VNode() { this(null, null); } public VNode(Object data) {
//改变队列尾的位置 //队首结点出列 //被删除的结点是队尾结点时 //返回队首结点的数据域值 //顶点信息 //指向第一条依附于该顶点的弧
this(data, null); } public VNode(Object data, ArcNode firstArc) { this.data = data; this.firstArc = firstArc; } public Object getData() { return data; } public ArcNode getFirstArc() { return firstArc; } public void setData(Object data) { this.data = data; } public void setFirstArc(ArcNode firstArc) { this.firstArc = firstArc; } }
边结点类 package ch06;
public class ArcNode{
private int adjVex; //该弧所指向的顶点位置 private int value; //边或弧的权值 private ArcNode nextArc; //指向下一条弧 public ArcNode() { this(-1,0,null); }
public ArcNode(int adjVex) { this(adjVex,0,null); }
public ArcNode(int adjVex,int value) { this(adjVex,value,null); }
public ArcNode(int adjVex,int value,ArcNode nextArc) { this.value=value; this.adjVex = adjVex;
this.nextArc = nextArc; }
public int getValue(){ return value; }
public ArcNode getNextArc() { return nextArc;
}
public int getAdjVex() { return adjVex; }
public void setAdjVex(int adjVex) { this.adjVex = adjVex; }
public void setValue(int value) { this.value = value; }
public void setNextArc(ArcNode nextArc) { this.nextArc = nextArc; } }
图的类型类 package ch06;
public enum GraphKind { UDN, DN; }
图的抽象类 package ch06;
public interface IGraph{
void createGraph(); int getVexNum(); int getArcNum(); Object getVex(int v) throws Exception; int locateVex(Object vex); int firstAdjVex(int v) throws Exception; int nextAdjVex(int v,int w) throws Exception; }
图的邻接表类 package ch06;
import java.util.Scanner;
public class ALGraph implements IGraph{ private GraphKind kind; private int vexNum,arcNum; private VNode[] vexs; public ALGraph(){ this(null,0,0,null); }
public ALGraph(GraphKind kind,int vexNum,int arcNum,VNode[] vexs){ this.kind=kind;
this.vexNum=vexNum;
this.arcNum=arcNum; this.vexs=vexs; }
//图的创建模块下的子菜单 public void createGraph(){
Scanner sc=new Scanner(System.in);
System.out.println(\"请输入图的类型:1--无向网2--有向网3--退出\"); int kind;
kind =sc.nextInt(); while(kind!=3){ switch(kind){ case 1: System.out.println(\"您选择的是无向网请继续接下来的操作:\"); createUDN(); displayUDN(); break; case 2: System.out.println(\"您选择的是有向网请继续接下来的操作:\"); createDN(); displayDN(); break; default: System.out.println(\"请选择正确的选项!\"); break; }
kind =sc.nextInt(); } }
//创建有向网
private void createDN(){ Scanner sc=new Scanner(System.in); System.out.println(\"请分别输入图的顶点数、图的边数:\"); vexNum=sc.nextInt(); arcNum=sc.nextInt(); vexs = new VNode[vexNum]; System.out.println(\"请分别输入图的各顶点:\"); for(int v=0;v } //创建无向网 private void createUDN() { Scanner sc = new Scanner(System.in); System.out.println(\"请分别输入图的顶点数、图的边数:\"); vexNum = sc.nextInt(); arcNum = sc.nextInt(); vexs = new VNode[vexNum]; System.out.println(\"请分别输入图的各个顶点:\"); for (int v = 0; v < vexNum; v++) vexs[v] = new VNode(sc.next()); System.out.println(\"请输入各个边的顶点及其权值:\"); for (int k = 0; k < arcNum; k++) { int v = locateVex(sc.next()); int u = locateVex(sc.next()); int value=sc.nextInt(); addArc(v,u,value); addArc(u,v,value); display UDN(); } } //输出有向网 public void displayDN(){ System.out.println(\"输入有向网如下:\"); for (int j=0;j \" \"+value); } } //输出无向网 public void displayUDN(){ System.out.println(\"输入无向网如下:\"); for (int j=0;j } } public void addArc(int v,int u,int value){ //插入边结点 ArcNode arc=new ArcNode(u,value); arc.setNextArc(vexs[v].getFirstArc()); vexs[v].setFirstArc(arc); } public int getVexNum(){ //返回顶点数 return vexNum; } public int getArcNum(){ //返回边数 return arcNum; } public int locateVex(Object vex){ for(int v=0;v public GraphKind getKind(){ return kind; } public Object getVex(int v)throws Exception{ if(v<0&&v>=vexNum) throw new Exception(\"第\"+v+\"个顶点不存在!\"); return vexs[v].getData(); } //返回v的第一个邻接点,若v没有邻接点,则返回-1,0<=v throw new Exception(\"第\"+v+\"个顶点不存在!\"); VNode vex=vexs[v]; if(vex.getFirstArc()!=null) return vex.getFirstArc().getAdjVex(); else return -1; } //查找下一个邻接点 public int nextAdjVex(int v,int w)throws Exception{ if(v<0&&v>=vexNum) throw new Exception(\"第\"+v+\"个顶点不存在!\"); VNode vex=vexs[v]; ArcNode arcvw=null; for(ArcNode arc=vex.getFirstArc();arc!=null;arc=arc.getNextArc()) if(arc.getAdjVex()==w){ arcvw=arc; break; } if(arcvw!=null&&arcvw.getNextArc()!=null) return arcvw.getNextArc().getAdjVex(); else return -1; } //图的创建的主方法 public static void main(String[] args) { ALGraph a = new ALGraph(); a.createGraph(); } } 图的遍历类 package ch06; import ch06.LinkQueue; class ArcNodei { private int adjVex; // 该弧所指向的顶点位置 private ArcNodei nextArc; // 指向下一条弧 public ArcNodei() { this(-1,null); } public ArcNodei(int adjVex) { this(adjVex, null); } public ArcNodei(int adjVex, ArcNodei nextArc) { this.adjVex = adjVex; this.nextArc = nextArc; } public ArcNodei getNextArc() { return nextArc; } public int getAdjVex() { return adjVex; } public void setAdjVex(int adjVex) { this.adjVex = adjVex; } public void setNextArc(ArcNodei nextArc) { this.nextArc = nextArc; } } //图的邻接表存储表示中的顶点结点类 class VNodei { private Object data;// 顶点信息 private ArcNodei firstArc;// 指向第一条依附于该顶点的弧 public VNodei() { this(null, null); } public VNodei(Object data) { this(data, null); } public VNodei(Object data, ArcNodei firstArc) { this.data = data; this.firstArc = firstArc; } public Object getData() { return data; } public ArcNodei getFirstArc() { return firstArc; } public void setData(Object data) { this.data = data; } public void setFirstArc(ArcNodei firstArc) { this.firstArc = firstArc; } } //无向图的邻接表类 class AL { private int vexNum, arcNum; // 图的当前顶点数和边数 private VNodei[] vexs; // 顶点 public AL() { this( 0, 0, null); } public AL( int vexNum, int arcNum, VNodei[] vexs) { this.vexNum = vexNum; this.arcNum = arcNum; this.vexs = vexs; } public int getArcNum() { return arcNum; } public void setArcNum(int arcNum) { this.arcNum = arcNum; } public int getVexNum() { return vexNum; } public void setVexNum(int vexNum) { this.vexNum = vexNum; } public VNodei[] getVexs() { return vexs; } public void setVexs(VNodei[] vexs) { this.vexs = vexs; } // 返回v表示结点的值, 0 <= v < vexNum public Object getVex(int v) throws Exception { if (v < 0 && v >= vexNum) throw new Exception(\"第\" + v + \"个顶点不存在!\"); return vexs[v].getData(); } // 返回v的第一个邻接点,若v没有邻接点则返回-1, 0 <= v < vexnum public int firstAdjVex(int v) throws Exception { if (v < 0 && v >= vexNum) throw new Exception(\"第\" + v + \"个顶点不存在!\"); VNodei vex = vexs[v]; if (vex.getFirstArc() != null) return vex.getFirstArc().getAdjVex(); else return -1; } // 返回v相对于w的下一个邻接点,若w是v的最后一个邻接点,则返回-1,其中0 ≤v, w if (arcvw != null && arcvw.getNextArc() != null) return arcvw.getNextArc().getAdjVex(); else return -1; } //邻接表的输出 public void displayAL(){ for (int i=0; i System.out.print(p.getAdjVex()+\" \"); p=p.getNextArc(); } System.out.println(); } } //图的遍历类 class TraverserAL { private static boolean[] visited; // 访问标志数组 // 对图G做深度优先遍历 public static void DFSTraverse(AL G) throws Exception { visited = new boolean[G.getVexNum()]; for (int v = 0; v < G.getVexNum(); v++) // 访问标志数组初始化 visited[v] = false; for (int v = 0; v < G.getVexNum(); v++) if (!visited[v])// 对尚未访问的顶点调用DFS DFS(G, v); } // 从第v个顶点出发递归地深度优先遍历图G public static void DFS(AL G, int v) throws Exception { visited[v] = true; System.out.print(G.getVex(v).toString() + \" \"); // 访问第v个顶点 for (int w = G.firstAdjVex(v); w >= 0; w = G.nextAdjVex(v, w)) if (!visited[w]) // 对v的尚未访问的邻接顶点w递归调用DFS DFS(G, w); } public static void BFSTraverse(AL G) throws Exception { //对图G做广度优先遍历 visited = new boolean[G.getVexNum()]; // 访问标志数组 for (int v = 0; v < G.getVexNum(); v++) // 访问标志数组初始化 visited[v] = false; for (int v = 0; v < G.getVexNum(); v++) if (!visited[v]) // v尚未访问 BFS(G, v); } private static void BFS(AL G, int v) throws Exception { visited[v] = true; System.out.print(G.getVex(v).toString() + \" \"); LinkQueue Q = new LinkQueue(); // 辅助队列Q Q.offer(v);// v入队列 while (!Q.isEmpty()) { int u = (Integer) Q.poll(); // 队头元素出队列并赋值给u for (int w = G.firstAdjVex(u); w >= 0; w = G.nextAdjVex(u, w)) if (!visited[w]) { // w为u的尚未访问的邻接顶点 visited[w] = true; System.out.print(G.getVex(w).toString() + \" \"); Q.offer(w); } } } } //测试类 public class ergodic{ public static AL generateAL() { //创建无向图的邻接表 ArcNodei v01 = new ArcNodei(1); ArcNodei v02 = new ArcNodei(2, v01); ArcNodei v03 = new ArcNodei(3, v02); VNodei v0 = new VNodei(\"v0\ ArcNodei v10 = new ArcNodei(0); ArcNodei v12 = new ArcNodei(2,v10); ArcNodei v14 = new ArcNodei(4,v12); VNodei v1 = new VNodei(\"v1\ ArcNodei v20 = new ArcNodei(0); ArcNodei v21 = new ArcNodei(1,v20); ArcNodei v23 = new ArcNodei(3,v21); ArcNodei v24 = new ArcNodei(4,v23); VNodei v2 = new VNodei(\"v2\ ArcNodei v30 = new ArcNodei(0); ArcNodei v32 = new ArcNodei(2,v30); ArcNodei v34 = new ArcNodei(4,v32); VNodei v3 = new VNodei(\"v3\ ArcNodei v41 = new ArcNodei(1); ArcNodei v42 = new ArcNodei(2,v41); ArcNodei v43 = new ArcNodei(3,v42); VNodei v4 = new VNodei(\"v4\ VNodei[] vexs = { v0, v1, v2, v3, v4 }; AL G = new AL( 5, 16, vexs); return G; } public static void main(String[] args) throws Exception { AL G = generateAL(); System.out.print(\"无向图为:\\n\"); G.displayAL(); System.out.print(\"无向图的广度优先遍历序列为:\"); TraverserAL.BFSTraverse(G); System.out.println(); System.out.print(\"无向图的深度优先遍历序列为:\"); TraverserAL.DFSTraverse(G); System.out.println(); } } 汇总类 package all; import java.util.Scanner; import ch06.ALGraph; import ch06.ergodic; import ch06.CriticalPath; public class all { public static void welcome(){ //主菜单 System.out.println(\" welcome to our system\"); System.out.println(\"***************************\"); System.out.println(\"* 1---图的创建 \"); System.out.println(\"* 2---图的遍历 \"); System.out.println(\"* 3---图的应用 \"); System.out.println(\"* 4---结 束 \"); System.out.println(\"* 5---使用说明 \"); System.out.println(\"***************************\"); } public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); welcome(); System.out.println(\" 请选择功能: \"); int kind; kind =sc.nextInt(); while(kind!=4){ switch (kind) { case 1: ALGraph.main(null); //调用图的创建的主方法 System.out.println(\"***************************************\"); break ; case 2: ergodic.main(null); //调用图的遍历的主方法 } } System.out.println(\"***************************************\"); break ; case 3: CriticalPath.main(null); //调用图的应用主方法 System.out.println(\"***************************************\"); break ; case 5: //使用说明 System.out.println(\"请通过选择输入1、2、3、4、5来选择相应的功能\\n \" + \" 1为图的创建,你可以实现有向网和无向网的邻接矩阵创建\\n \" + \" 2为图的遍历,可以实现图的深度和广度遍历\\n\" + \" 3为图的应用,可以实现AOE网的关键路径\\n\" + \" 4为结束,可以结束运行\"); System.out.println(\"***************************************\"); break; default: System.out.println(\"请选择正确的选项!\"); break; } welcome(); System.out.println(\"请选择功能: \"); kind = sc.nextInt(); }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务