數據結構(Java版)ch2 線性表的順序存儲(順序表)
線性表的抽象數據Java接口描述如下:
package ch2; /** * 線性表的抽象數據接口,用Java語言描述線性表的這些功能! * @author 房廷飛 * */ public interface IList { public void clear(); //將線型表置成空表 public boolean isEmpty(); //判斷是不是空表 public int length(); //返回線性表的長度 public Object get(int i) throws Exception; //返回線性表中第i個數據元素 public void insert(int i,Object x) throws Exception; //插入x作為第i個元素 public void remove (int i) throws Exception; //s刪除第i個元素 public int indexOf(Object x); //查找並返回元素x首次出現的位序號 public void display(); //輸出線性表中各個數據元素的值 }
順序表類的Java語言描述,順序表類的基本操作實現:
package ch2; /** * 用Java語言描述線性表的接口指定功能 * @author 房廷飛 * */ public class SqList implements IList{ //執行IList接口 //構造一個存儲空間為maxsize的順序表 private Object[] listItem; //順序表的存儲空間 private int curLen; //順序表當前的長度 private int maxSize; //構造一個存儲空間為maxsize的順序表 public SqList (int maxsize) { curLen=0; maxSize=maxsize; listItem=new Object[maxSize]; } @Override public void clear() { // TODO Auto-generated method stub curLen=0; } @Override public boolean isEmpty() { // TODO Auto-generated method stub return curLen==0; } @Override public int length() { // TODO Auto-generated method stub return curLen; } @Override public Object get(int i) throws Exception { // TODO Auto-generated method stub if(i<0||i>curLen-1) throw new Exception("第"+i+"個元素不存在!"); return listItem[i]; } @Override public void insert(int i, Object x) throws Exception { // TODO Auto-generated method stub if (curLen==maxSize) throw new Exception("順序表已滿,不能插入!"); if (i<0||i>curLen) throw new Exception("插入位置不合法!"); for(int j=curLen;j>i;j--) { //插入是從最后遞減重排序 //標識,可嘗試改 listItem[j]=listItem[j-1]; } listItem[i]=x; curLen++; } @Override public void remove(int i) throws Exception{ // TODO Auto-generated method stub if(i<0||i>curLen-1) throw new Exception("移除位置不合法!"); for(int j=i;j<curLen-1;j++) { //移除是從i處遞增重排序 listItem[j]=listItem[j+1]; } curLen--; } @Override public int indexOf(Object x) { // TODO Auto-generated method stub for(int i=0;i<=curLen;i++) { if(listItem[i].equals(x)) { return i; } } return -1; } @Override public void display() { // TODO Auto-generated method stub for(int i=0;i<curLen;i++) { System.out.println(listItem[i]); } } }
通過兩個小例子應用順序表:
demo1:
package ch2; import java.util.Scanner; /** * 例一:建立一個由a-z的26個英文字母組成的字母順序表,求每個字母的直接前驅和直接后繼,編程實現! * @author 房廷飛 * */ public class Practice01 extends SqList{ public Practice01(int maxsize) { super(maxsize); // TODO Auto-generated constructor stub } public static void main(String[] args) throws Exception { Practice01 p1=new Practice01(26); for(int i=0;i<26;i++) { p1.insert(i,(char)(97+i)); } System.out.println("請輸入要查詢的字母位序號(0~25):"); int i = new Scanner(System.in).nextInt(); if(i>0&&i<25) { System.out.println("第"+i+"個字母的直接前驅為:"+p1.get(i-1)); System.out.println("第"+i+"個字母的直接后驅為:"+p1.get(i+1)); } else if(i==0) { System.out.println("第"+i+"個字母的直接前驅不存在,直接后驅為:"+p1.get(i+1)); } else { System.out.println("第"+i+"個字母的直接后驅不存在,直接前驅為:"+p1.get(i-1)); } } }
demo2:
package ch2; /** * 例二:建立一個順序表,表中數據為5個學生的成績(89,93,92,90,100),然后查找成績為90的數據元素,並輸出其在數據表中的位置。 * @author 房廷飛 * */ public class Practice02 extends SqList{ public Practice02(int maxsize) { super(maxsize); // TODO Auto-generated constructor stub } public static void main(String[] args) throws Exception { Practice02 p2=new Practice02(5); p2.insert(0, 89); p2.insert(1, 93); p2.insert(2, 92); p2.insert(3, 90); p2.insert(4, 100); int a=p2.indexOf(90); if(a==-1) { System.out.println("順序表中不存在成績為90的學生!"); } else { System.out.println("順序表中成績為90的數據元素的位置為:"+a); //3 } } }
數據結構(Java版)ch2 線性表的順序存儲(順序表)
2019-04-06 17:51:34 房廷飛 加油!