JavaScript數(shù)據(jù)結(jié)構(gòu)與算法-列表練習(xí)

實(shí)現(xiàn)列表類

// 列表類
function List () {
    this.listSize = 0; // 列表的元素個(gè)數(shù)
    this.pos = 0; // 列表的當(dāng)前位置
    this.dataStore = []; // 初始化一個(gè)空數(shù)組來保存列表元素
    this.clear = clear; // 清空列表中的所有元素
    this.find = find;
    this.toString = toString;
    this.insert = insert;
    this.append = append;
    this.remove = remove;
    this.front = front;
    this.end = end;
    this.prev = prev;
    this.next = next;
    this.hasNext = hasNext;
    this.hasPrev = hasPrev;
    this.length = length;
    this.currPos = currPos; // 返回列表的當(dāng)前位置
    this.moveTo = moveTo;
    this.getElement = getElement; // 返回當(dāng)前位置的元素
    this.contains = contains;
}
// append: 給列表添加元素
function append (element) {
    this.dataStore[this.listSize++] = element;
}
// find: 在列表中查找某一元素 indexOf?
function find (element) {
    for (let i = 0; i < this.dataStore.length; i++) {
        if (this.dataStore[i] === element) {
            return i;
        }
    }
    return -1;
}
// remove: 從列表中刪除元素
function remove (element) {
    let foundAt = this.find(element);
    if (foundAt > -1) {
        this.dataStore.splice(foundAt, 1);
        this.listSize--;
        return true;
    }
    return false;
}
// length: 列表中有多少個(gè)元素 與listSize區(qū)別?
function length () {
    return this.listSize;
}
// toString: 顯示列表中的元素
function toString () {
    return this.dataStore;
}
// insert: 向列表中插入一個(gè)元素
function insert (element, after) {
    let insertPos = this.find(after);
    if (insertPos > -1) {
        this.dataStore.splice(insertPos + 1, 0, element);
        this.listSize++;
        return true;
    }
    return false;
}
// clear: 清空列表中所有的元素
function clear () {
    delete this.dataStore;
    this.dataStore.length = 0;
    this.listSize = this.pos = 0;
}
// contains: 判斷給定值是否在列表中 find?
function contains (element) {
    for (let i = 0; i < this.dataStore.length; i++) {
        if (this.dataStore[i] === element) {
            return true;
        }
    }
    return false;
}
// 遍歷列表
function front () {
    this.pos = 0;
}
function end () {
    this.pos = this.listSize - 1;
}
function prev () {
    --this.pos;
}
function next () {
    if (this.pos < this.listSize) {
        ++this.pos;
    }
}
function currPos () {
    return this.pos;
}
function moveTo (position) {
    this.pos = position;
}
function getElement () {
    return this.dataStore[this.pos];
}
function hasNext () {
    return this.pos < this.listSize;
}
function hasPrev () {
    return this.pos >= 0;
}

練習(xí)

一. 增加一個(gè)向列表中插入元素的方法蛤奥,該方法只在待插元素大于列表中的所有元素時(shí)才執(zhí)行插入操作晒夹。這里的大于有多重含義裆馒,對于數(shù)字,它是指數(shù)值上的大胸で印喷好;對于字母,它是指在字母表中出現(xiàn)的先后順序响逢。

List.prototype.insertThen = function (element) {
    let type = typeof element;
    if (type === `number`) {
        // debugger;
        for (let i = 0; i < this.dataStore.length; i++) {
            if (typeof this.dataStore[i] === `number` && element > this.dataStore[i]) { // 同時(shí)滿足是數(shù)字然后插入的元素大于數(shù)組內(nèi)的元素
                this.append(element);
                return true;
            }
        }
    } else {
        let newArr = this.dataStore.filter((val) => {
            return typeof val !== `number`;
        }).concat([element]).sort();
        if (newArr.indexOf(element) === (newArr.length - 1)) {
            this.append(element);
            return true;
        }
    }
    return false;
};
// 示例
let DataThen = new List();
DataThen.append(`Mazey`);
DataThen.append(`Cherrie`);
DataThen.append(`Luna`);
DataThen.append(`John`);
DataThen.append(`July`);
DataThen.append(23);
DataThen.append(73);
console.log(DataThen.toString()); // ["Mazey", "Cherrie", "Luna", "John", "July", 23, 73]
DataThen.insertThen(99);
DataThen.insertThen(12);
console.log(DataThen.toString()); // ["Mazey", "Cherrie", "Luna", "John", "July", 23, 73, 99]
DataThen.insertThen(`Jay`);
DataThen.insertThen(`Zero`);
console.log(DataThen.toString()); // ["Mazey", "Cherrie", "Luna", "John", "July", 23, 73, 99, "Zero"]

二. 增加一個(gè)向列表中插入元素的方法绒窑,該方法只在待插元素小于列表中的所有元素時(shí)才執(zhí)行插入操作。

List.prototype.insertThen = function (element) {
    let type = typeof element;
    if (type === `number`) {
        // debugger;
        for (let i = 0; i < this.dataStore.length; i++) {
            if (typeof this.dataStore[i] === `number` && element < this.dataStore[i]) { // 同時(shí)滿足是數(shù)字然后插入的元素大于數(shù)組內(nèi)的元素
                this.append(element);
                return true;
            }
        }
    } else {
        let newArr = this.dataStore.filter((val) => {
            return typeof val !== `number`;
        }).concat([element]).sort();
        if (newArr.indexOf(element) === 0) {
            this.append(element);
            return true;
        }
    }
    return false;
};
// 示例
let DataThen = new List();
DataThen.append(`Mazey`);
DataThen.append(`Cherrie`);
DataThen.append(`Luna`);
DataThen.append(`John`);
DataThen.append(`July`);
DataThen.append(23);
DataThen.append(73);
console.log(DataThen.toString()); // ["Mazey", "Cherrie", "Luna", "John", "July", 23, 73]
DataThen.insertThen(99);
DataThen.insertThen(12);
console.log(DataThen.toString()); // ["Mazey", "Cherrie", "Luna", "John", "July", 23, 73, 12]
DataThen.insertThen(`Jay`);
DataThen.insertThen(`Zero`);
DataThen.insertThen(`Ada`);
console.log(DataThen.toString()); // ["Mazey", "Cherrie", "Luna", "John", "July", 23, 73, 12, "Ada"]

三. 創(chuàng)建Person類舔亭,該類用于保存人的姓名和性別信息些膨。創(chuàng)建一個(gè)至少包含10個(gè)Person對象的列表。寫一個(gè)函數(shù)顯示列表中所有擁有相同性別的人钦铺。

function Person () {
    this.list = [];
    this.save = save;
    this.showSameGender = showSameGender;
}
// 保存人名和性別
function save (name, gender) {
    let littleCase = {
        name,
        gender
    };
    this.list.push(littleCase);
}
// 顯示相同性別的人
function showSameGender (gender) {
    let ret = [];
    let len = this.list.length;
    while (len--) {
        if (this.list[len].gender === gender) {
            ret.push(this.list[len].name);
        }
    }
    return ret;
}
// 示例
let people = new Person();
people.save(`Mazey`, `male`);
people.save(`John`, `male`);
people.save(`Zero`, `male`);
people.save(`July`, `male`);
people.save(`Bob`, `male`);
people.save(`Ada`, `female`);
people.save(`Cherrie`, `female`);
people.save(`Luna`, `female`);
people.save(`Lucy`, `female`);
people.save(`June`, `female`);
console.log(people.list);
console.log(people.showSameGender(`male`)); // ["Bob", "July", "Zero", "John", "Mazey"]
console.log(people.showSameGender(`female`)); // ["June", "Lucy", "Luna", "Cherrie", "Ada"]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末订雾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子矛洞,更是在濱河造成了極大的恐慌洼哎,老刑警劉巖烫映,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異噩峦,居然都是意外死亡锭沟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門识补,熙熙樓的掌柜王于貴愁眉苦臉地迎上來族淮,“玉大人,你說我怎么就攤上這事凭涂∽@保” “怎么了?”我有些...
    開封第一講書人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵切油,是天一觀的道長蝙斜。 經(jīng)常有香客問我,道長澎胡,這世上最難降的妖魔是什么孕荠? 我笑而不...
    開封第一講書人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮滤馍,結(jié)果婚禮上岛琼,老公的妹妹穿的比我還像新娘。我一直安慰自己巢株,他們只是感情好槐瑞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阁苞,像睡著了一般困檩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上那槽,一...
    開封第一講書人閱讀 49,729評(píng)論 1 289
  • 那天悼沿,我揣著相機(jī)與錄音,去河邊找鬼骚灸。 笑死糟趾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甚牲。 我是一名探鬼主播义郑,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丈钙!你這毒婦竟也來了非驮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤雏赦,失蹤者是張志新(化名)和其女友劉穎劫笙,沒想到半個(gè)月后芙扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡填大,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年戒洼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片允华。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡施逾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出例获,到底是詐尸還是另有隱情,我是刑警寧澤曹仗,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布榨汤,位于F島的核電站,受9級(jí)特大地震影響怎茫,放射性物質(zhì)發(fā)生泄漏收壕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一轨蛤、第九天 我趴在偏房一處隱蔽的房頂上張望蜜宪。 院中可真熱鬧,春花似錦祥山、人聲如沸圃验。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澳窑。三九已至,卻和暖如春供常,著一層夾襖步出監(jiān)牢的瞬間摊聋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來泰國打工栈暇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麻裁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓源祈,卻偏偏與公主長得像煎源,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子新博,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容