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

          常用鏈接

          留言簿(19)

          隨筆檔案(115)

          文章檔案(4)

          新聞檔案(1)

          成員連接

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

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

          第一講 ? 線性表

          ?? 數(shù)據(jù)結(jié)構(gòu)包括數(shù)據(jù)的邏輯結(jié)構(gòu)、儲(chǔ)存結(jié)構(gòu)以及對(duì)數(shù)據(jù)的操作,線性表的含義就是:除了第一個(gè)和最后一個(gè)數(shù)據(jù)元素,其他的只有一個(gè)前驅(qū)元素和一個(gè)后繼元素,如下圖:

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

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

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

          (1) 求出當(dāng)前集合中數(shù)據(jù)元素個(gè)數(shù)( size ;

          (2) 向當(dāng)前數(shù)據(jù)集合任意位置插入新的數(shù)據(jù) (insert);

          (3) 刪除當(dāng)前數(shù)據(jù)集合中的任意數(shù)據(jù) (delete);

          (4) 獲取當(dāng)前數(shù)據(jù)集合中的任意數(shù)據(jù) (getData);

          (5) 判斷當(dāng)前數(shù)據(jù)集合是否為空 ;

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

          ?

          public interface List {

          ?/**

          ? * @author 天意

          ? */

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

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

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

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

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

          }

          ,由于所有線性表的操作都是圍繞以上而來(lái)的,所以上面的接口就可以通用于所有線性表了,這就告訴大家在設(shè)計(jì)程序時(shí)要做好充分的考慮,強(qiáng)調(diào)一個(gè)“廣”字。

          線性表包括順序表和鏈?zhǔn)奖恚紫戎v一下順序表,順序表顧名思義,就是數(shù)據(jù)元素按一定組合在一起的,邏輯上相鄰的元素在物理儲(chǔ)存上也是相鄰的,如下如示例:

          A0

          A1

          A2

          A3

          A4

          A5

          ……

          ?

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

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

          ?

          public class SeqList implements List {

          ?

          ?????? /**

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

          ?????? ?*/

          ?????? final int defaultSize=10;// 默認(rèn)為 10 個(gè),你可以自己隨便改

          ?????? 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 對(duì)象

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

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

          ???? }

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

          ??? ?????? ?throw new Exception(" 參數(shù)錯(cuò)誤 ");

          ???? }

          ???? 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(" 順序表已空無(wú)法刪除! ");

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

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

          ???????????????????? throw new Exception(" 參數(shù)錯(cuò)誤! ");

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

          ????????????? 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(" 參數(shù)錯(cuò)誤! ");

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

          ????????????? 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;

          ?????? }

          ?

          }

          ,以上就可以實(shí)現(xiàn)順序表的所有操作了,你可以自己試一下,這里要說(shuō)明的是,因?yàn)轫樞虮碇袃?chǔ)存的對(duì)象類型可以任意,所以設(shè)計(jì)時(shí)一定要使用 Object 類,當(dāng)然有時(shí)為了限定具體類型你可以重寫這個(gè)類然后拋出相應(yīng)的異常即可,這個(gè)順序表的效率分析工作留給大家,大家可以到論壇跟貼,下一講鏈?zhǔn)奖?/span>!

          (注:本文作者,EasyJF開源團(tuán)隊(duì) 天意,轉(zhuǎn)載請(qǐng)保留作者聲明!)

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

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

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

          // 在 i 位置插入 obj 對(duì)象

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

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

          }

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

          throw new Exception(" 參數(shù)錯(cuò)誤 ");

          }

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

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

          listArray[i]=obj;

          size++;

          }
            回復(fù)  更多評(píng)論
            
          # re: 數(shù)據(jù)結(jié)構(gòu)系列教程(一)  2006-08-16 09:47 馬嘉楠
          如果用戶想要在表頭插入一個(gè)元素,也許大多數(shù)用戶(不是程序員)的習(xí)慣是輸入位置1而非0,所以是否應(yīng)該對(duì)傳進(jìn)來(lái)的參數(shù)進(jìn)行減1的操作啊?

          純屬個(gè)人意見,呵呵

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

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 松滋市| 九龙城区| 涟水县| 金川县| 安西县| 苍南县| 邵东县| 井研县| 谢通门县| 韶关市| 宿松县| 泽库县| 华蓥市| 盖州市| 道真| 天门市| 宜兰县| 梁河县| 穆棱市| 三穗县| 义马市| 弥勒县| 方山县| 新邵县| 祁连县| 朝阳区| 定远县| 老河口市| 渭南市| 渭源县| 甘德县| 紫云| 江城| 扎兰屯市| 福泉市| 大理市| 宜阳县| 方正县| 敦化市| 巴林左旗| 临泽县|