隨筆 - 115  文章 - 481  trackbacks - 0
          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(19)

          隨筆檔案(115)

          文章檔案(4)

          新聞檔案(1)

          成員連接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

            接觸不少程序員,都能夠獨立的作一下小型應用系統,和他們交談起來才發現,他們純粹是程序員,對基礎的掌握太差,比喻 java 程序員,就是對 jdk 和各種框架特別的熟悉,能夠熟練的運用其中的各種包、類以及一些組件,確實能做出一下系統來,但是涉及到一些特殊的設計方法來就不行了,對基礎掌握太差,包括現在的很多培訓,都是灌輸這些所謂的實際應用的東西,學好基礎才是最關鍵的東西,學一門語言很快,沒有很好的基礎、清晰的思路只能照葫蘆畫瓢了,為此,筆者結合自己的學習經驗寫了系列教程,主要包括數據結構的全部內容:線性表、樹、圖、數組、集合、矩陣、排序、查找、哈希表,并將 java 的設計思想、方法及一些常見的算法、設計模式貫穿其中,希望能給初學者一個很好的幫助,由于本人水平有限,同時請大家給與批評指正!

          第一講 ? 線性表

          ?? 數據結構包括數據的邏輯結構、儲存結構以及對數據的操作,線性表的含義就是:除了第一個和最后一個數據元素,其他的只有一個前驅元素和一個后繼元素,如下圖:

          ?? A--->B--->C--->D

          這個就是一個最簡單的線性表的實例,結合定義可以很好的理解的,數據結構中最常見的就是提到抽象數據類型,所謂抽象數據類型就是在基本數據類型支持下用戶新設計的數據類型,通俗的說就是用戶對基本數據類型(整型、浮點型等等)的組合應用成自己的一種新型的數據類型,也就是 java 中接口和抽象類,這么說可能有些不妥,不過這樣最好理解,前面講到數據結構包括對數據的操作,這個設計數據結構的最終目的,下面我們就講講 java 數據結構中的線性表的設計思想。

          由于線性表的數據集合可以表示為序列: A1,A2,A3……….An-1, 每個元素的類型都是任意的,對于這個集合的操作可以歸結如下:

          (1) 求出當前集合中數據元素個數( size ;

          (2) 向當前數據集合任意位置插入新的數據 (insert);

          (3) 刪除當前數據集合中的任意數據 (delete);

          (4) 獲取當前數據集合中的任意數據 (getData);

          (5) 判斷當前數據集合是否為空 ;

          ,由于存在很多不同形式的線性表結構,對其操作方式當然也不一樣,這樣就要求設計一個大家都能使用的數據類型,由前面的講述大家就可以想到必須要設計一個抽象數據類型,也就是一個接口,這時可能有人問為什么不設計一個抽象類阿?這個問題留個大家思考,可以到論壇發表。 Java 中可以這樣定義這個接口:

          ?

          public interface List {

          ?/**

          ? * @author 天意

          ? */

          ?????? public void insert(int i,Object obj ) throws Exception;// 在任意位置插入數據

          ?????? public Object delete(int i) throws Exception;// 刪除任意位置的數據

          ?????? public Object getData(int i) throws Exception;// 獲取任意位置的數據

          ?????? public int size();// 獲取當前集合的大小

          ?????? public boolean isEmpty();// 判斷當前集合是否為空

          }

          ,由于所有線性表的操作都是圍繞以上而來的,所以上面的接口就可以通用于所有線性表了,這就告訴大家在設計程序時要做好充分的考慮,強調一個“廣”字。

          線性表包括順序表和鏈式表,首先講一下順序表,順序表顧名思義,就是數據元素按一定組合在一起的,邏輯上相鄰的元素在物理儲存上也是相鄰的,如下如示例:

          A0

          A1

          A2

          A3

          A4

          A5

          ……

          ?

          0?????? 1????????? 2???????? 3??????? 4???????? 5? ???????????????maxSize-1

          結合這個圖我們可以想到:首先建立這個表就必須有個初始大小,然后才能對他就行實際操作,插入操作時可能會出現表已滿、插入位置不存在的情況,刪除時可能出現表已空、刪除的元素不存在的情況,獲取時可能出現要求的元素不存在的情況,考慮這些因素就可以設計這個順序表的操作類了 SeqList.java ,具體內容如下:

          ?

          public class SeqList implements List {

          ?

          ?????? /**

          ?????? ?* @author 天意

          ?????? ?*/

          ?????? final int defaultSize=10;// 默認為 10 個,你可以自己隨便改

          ?????? int maxsize;

          ?????? int size;

          ?????? Object[] listArray;

          ?????? public SeqList(){

          ????????????? initiate(defaultSize);

          ?????? }

          ?????? public SeqList(int size){

          ????????????? initiate(size);

          ?????? }

          ?????? private void initiate(int sz) {

          ????????????? // 初始化

          ????????????? maxsize=sz;

          ????????????? size=0;

          ????????????? listArray=new Object[sz];

          ?????? }

          ?????? public void insert(int i, Object obj) throws Exception {

          ????????????? // i 位置插入 obj 對象

          ???? if(size==maxsize){

          ??? ?????? ?throw new Exception(" 順序表無法插入 ");

          ???? }

          ???? if (i<0||i>size){

          ??? ?????? ?throw new Exception(" 參數錯誤 ");

          ???? }

          ???? for(int j=size;j>i;j--)

          ??? ?????? ?listArray[j]=listArray[j-1];

          ???????? listArray[i]=obj;

          ???????? size++;

          ?????? }

          ?

          ?????? public Object delete(int i) throws Exception {

          ????????????? // 刪除 i 位置的元素

          ????????????? if (size==0){

          ???????????????????? throw new Exception(" 順序表已空無法刪除! ");

          ????????????? }

          ????????????? if(i<0||i>size-1){

          ???????????????????? throw new Exception(" 參數錯誤! ");

          ????????????? }

          ????????????? Object it=listArray[i];

          ????????????? for(int j=i;j<size-1;j++)

          ???????????????????? listArray[j]=listArray[j+1];

          ????????????? size--;

          ????????????? return it;

          ?????? }

          ?

          ?????? public Object getData(int i) throws Exception {

          ????????????? // 獲取 i 位置的元素并返回

          ????????????? if(i<0||i>=size){

          ???????????????????? throw new Exception(" 參數錯誤! ");

          ????????????? }

          ????????????? return listArray[i];

          ????????????? }

          ?

          ?????? public int size() {

          ????????????? // 獲得大小

          ????????????? return size;

          ?????? }

          ?

          ?????? public boolean isEmpty() {

          ????????????? // 判斷是否為空

          ????????????? return size==0;

          ?????? }

          ?????? public int MoreDataDelete(SeqList L,Object x)throws Exception{

          ????????????? int i;

          ????????????? int tag=0;

          ????????????? for( i=0;i<L.size;i++){

          ???????????????????? if(x.equals(L.getData(i))){

          ??????????????????????????? L.delete(i);

          ??????????????????????????? i--;

          ??????????????????????????? tag=1;

          ???????????????????? }

          ????????????????????

          ????????????? }

          ????????????? return tag;

          ?????? }

          ?

          }

          ,以上就可以實現順序表的所有操作了,你可以自己試一下,這里要說明的是,因為順序表中儲存的對象類型可以任意,所以設計時一定要使用 Object 類,當然有時為了限定具體類型你可以重寫這個類然后拋出相應的異常即可,這個順序表的效率分析工作留給大家,大家可以到論壇跟貼,下一講鏈式表

          (注:本文作者,EasyJF開源團隊 天意,轉載請保留作者聲明!)

          posted on 2006-08-15 14:57 簡易java框架 閱讀(4994) 評論(19)  編輯  收藏

          FeedBack:
          # re: 數據結構系列教程(一)  2006-08-15 15:06 基礎就是生命
          現在各個論壇,blog都被充斥了一種浮躁的東西,各式各樣美好的框架。接觸到的很多新程序員都還沒有開始寫過一行代碼,就開始學習那些框架。結果使得自己沉迷于框架不能自拔。也不能真正掌握為什么需要這樣那樣的框架。以后這樣基礎的文章還是要多寫點啊。可惜,本人力不從心。  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-15 16:22 深藍色心情
          這些學數據結構的時候不都學過嗎?  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-15 17:31 Dustin
          All about Surviving!
          剛出來的畢業生要找個工作不容易啊, 看看招人啟示都是充斥著各種框架的名稱.沒說要招懂數據結構和算法的.
          當然與咱們內地大學的整體教學水平太次, 以及整體的學習氛圍有關. 各種原理課程在大學都有開課,不是教授太水就是學生自己不努力,每天無所事事有關.  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-15 18:45 Shooper.Java
          這些東西在大學里搞得還蠻熟的,工作后就忘差不多了,不過這些思想還是很重要的  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-15 23:50 游客
          @Dustin
          招人的時候,會寫要招懂代數基礎的么?
          說是基礎,就是說默認已經具備這樣的能力了.數據結構都一點不懂,還寫啥程序啊  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-16 00:25 也來侃侃
          算法確實算是基礎,但是很多人學過,但都沒學好的基礎。我們公司招人一般就是強調要基礎好的,對算法掌握得熟悉,有較強邏輯思維及分析能力的才是關鍵。致于框架、工具嘛,這個關系不大,有了基礎,這些都很容易。而且更重要的是新員工要能學會公司的開發體系及相關規范,這個比工具重要得多。  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-16 09:44 馬嘉楠
          我有幾個地方不太明白,請樓主答復。一下是原文代碼:

          public void insert(int i, Object obj) throws Exception {

          // 在 i 位置插入 obj 對象

          if(size==maxsize){ //第一:此處是順序表為空的情況么?

          throw new Exception(" 順序表無法插入 ");

          }

          if (i<0||i>size){//第二:插入位置小于0大于最大值,是否應該改成i<0||i>maxsize?

          throw new Exception(" 參數錯誤 ");

          }

          for(int j=size;j>i;j--) //第三:是否應該改成(int j=maxsize;j>i;j--)?

          listArray[j]=listArray[j-1];

          listArray[i]=obj;

          size++;

          }
            回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-16 09:47 馬嘉楠
          如果用戶想要在表頭插入一個元素,也許大多數用戶(不是程序員)的習慣是輸入位置1而非0,所以是否應該對傳進來的參數進行減1的操作啊?

          純屬個人意見,呵呵

          很喜歡樓主的文章,期待下一講!  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-17 10:04 天意
          第一:此處是順序表為空的情況么?
          答:size標示當前數組儲存元素個數,size=maxSize就是說此時儲存器已經達到最大值,不能繼續儲存了!
          第二:插入位置小于0大于最大值,是否應該改成i<0||i>maxsize?
          答:線性表的元素儲存在一塊連續地址上的內存單元中,中間不能有空缺,比喻說size=0,maxSize=10,說明其中儲存了a0、a1、a2、a3、a4 這5個元素,要是改成i>maxSize的話就可以在i=8的位置儲存了,那樣的話地址就不連續了,所以不能改成maxSize;
          第三:是否應該改成(int j=maxsize;j>i;j--)?
          答:同上
          如果用戶想要在表頭插入一個元素,也許大多數用戶(不是程序員)的習慣是輸入位置1而非0,所以是否應該對傳進來的參數進行減1的操作啊?
          答:這里說的是線性表,按這個同學的說法,程序員應該設計一個鏈式表!詳情見:http://www.easyjf.com/html/20060815/3349457930690354.htm  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-18 09:59 dennis
          不錯的文章,頂一把  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-18 23:50 水色
          可不可以用 從c++語言,我想學學。  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-19 09:11 天意
          數據結構重點是個思想問題,語言的使用只不過是代碼問題而已,你可以根據不同的內容編寫c++的代碼,其算法和設計思想都是一樣的!由于本教程是基于EasyJF系列的,所以采用java作為描述語言!  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-19 10:47 gust
          你以為人人都是神啊,記憶再好,也會忘記的,特別是一些比較苦澀深奧的部分,當初即使完全理解了,學得很好,工作中幾年也不碰一下,誰還記得,關鍵就是這些理論和實際開發特別是國內現實開發情況脫節得比較厲害,東西都知道是好的,最終還不是放棄  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-19 20:41 天意
          @gust
          程序員和專家的區別就在這了,對底層的基礎知識掌握的不是很好的人只能是程序員,永遠到不了專家的行列,這和記憶沒有一點關系,只要是真正理解的就不會不知道的!   回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-24 09:31 ZerGravity
          不太同意這樣的理解  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-29 18:53 ***
          @基礎就是生命
          寫的很好,我就是基礎不好,想多看看基礎的東西缺又找不到好路線,基礎的書我也好多,但是總是感覺實際性不是很強...........框架我用的多了,是很爽.但是用的過程中會發現基礎真的是很爛!~

          "他們純粹是程序員"你的這句話一方面是對的,但是我告訴你,你以為誰都不學好基礎嗎.........話過分請擔待!~大家都想有自己的思想,誰也不想做個只會拿框架干活的人.....可能是有的時候真的是破與無奈.只能慢慢積累,你現在很強你才有實力說這種話....你沒有差的時候嗎  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-08-29 22:52 poscard
          《數據結構》和《操作系統》是兩門很重要的基礎課。我現在越來越感覺有必要把這兩方面的知識再學習、實踐一下了。
          程序開發中涉及很多對數據的抽象,還有像操作系統那樣對資源的管理。
          但,,在開發不出自己的作品之前就對這兩門基礎課進行深入學習,感覺好打擊自己對計算機軟件的興趣啊。  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-09-02 13:10 Nix
          @***
          誰都有差的時候,只不過知道自己差的時候去不去充實自己就是各人的區別了
          懂得充實自己的人當然會有實力。
          不要說沒有時間,事情忙,學習這東西,只要想學,永遠有機會。  回復  更多評論
            
          # re: 數據結構系列教程(一)  2006-11-03 22:24 colin yi
          d  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 福州市| 宜兰县| 高淳县| 闻喜县| 东安县| 文登市| 通渭县| 和平区| 安岳县| 渑池县| 湛江市| 渝北区| 辰溪县| 将乐县| 若羌县| 剑河县| 孟津县| 广西| 西吉县| 普格县| 无极县| 开阳县| 花莲县| 安远县| 沙河市| 商丘市| 新晃| 海原县| 榆社县| 深州市| 东港市| 安义县| 东源县| 筠连县| 昭觉县| 贵定县| 全州县| 兴安盟| 碌曲县| 永寿县| 东安县|