js數(shù)據(jù)結(jié)構(gòu)與算法_棧

1.解決問(wèn)題方法的效率,跟數(shù)據(jù)的組織方式是有關(guān)系的,比如圖書(shū)館借書(shū),需要刷門(mén)禁,找書(shū)架,拿到書(shū)找管理員登記等等流程
2.解決問(wèn)題方法的效率,和空間的利用率有關(guān)系 (遞歸打印1~100000(N), 方法一是循環(huán),方法二是遞歸胀莹,結(jié)果爆掉了直接輸出100000)
3.解決問(wèn)題方法的效率,也和算法的巧妙運(yùn)用程度有關(guān)系

數(shù)據(jù)結(jié)構(gòu)+算法=程序

抽象數(shù)據(jù)類(lèi)型(ATD)

1.抽象具有普適性,不會(huì)因?yàn)槲抑皩W(xué)的是C語(yǔ)言憨降,換成JAVA,PHP就不適用了。
2.抽象來(lái)源于實(shí)際该酗,高于實(shí)際授药,通過(guò)從一個(gè)問(wèn)題抽象出普適的理論,就可以解決其他相通的問(wèn)題

JavaScript基礎(chǔ)

操作符

算數(shù)操作符呜魄、賦值操作符悔叽、比較操作符、邏輯操作符爵嗅、位操作符娇澎、一元操作符和其他操作符 typeof,delete

真值和假值

在大多數(shù)編程語(yǔ)言中,布爾值true和false僅僅表示true/false

數(shù)值類(lèi)型 | 轉(zhuǎn)換成布爾值
-|-|-
undefined | false
null | false
布爾值 | true就是true,false就是false
數(shù)字 | +0,-0或NaN都是false,其他都是true
字符串 | 字符串為空(length為0)就是false,其他true
對(duì)象 | true

function testTruthy(val){ 
 return val ? console.log('truthy') : console.log('falsy'); 
} 

相等操作符

類(lèi)型x | 類(lèi)型y | 結(jié)果
-|-|-|-
null | undefined | true
undefined | null | true
數(shù)字 | 字符串 | x==toNumber(y)
字符串 | 數(shù)字 | toNumber(x)==y
布爾值 | 任何類(lèi)型 | toNumber(x)==y
任何類(lèi)型 | 布爾值 | x==toNumber(y)
字符串或數(shù)字 | 對(duì)象 | x == toPrimitive(y)
對(duì)象 | 字符串或數(shù)字 | toPrimitive(x) == y

如果x和y是相同類(lèi)型睹晒,JavaScript會(huì)比較它們的值或?qū)ο笾堤俗F渌麤](méi)有列在這個(gè)表格中的情況都會(huì)返回false括细。

條件語(yǔ)句

循環(huán)

do...while循環(huán)和while循環(huán)很相似。區(qū)別是

//在while循環(huán)里戚啥,先進(jìn)行條件判斷再執(zhí)行循環(huán)體中的代碼勒极,
var i = 0;
while (i < 10) {
    console.log(i);
    i++;
}


//而在do...while循環(huán)里,是先執(zhí)行循環(huán)體中的代碼再判斷循環(huán)條件
var i = 0;
do {
    console.log(i);
    i++;
} while (i < 10)

類(lèi)

function Book(title, pages, isbn){ //{1} 
 this.title = title; 
 this.pages = pages; 
 this.isbn = isbn; 
} 
Book.prototype.printTitle = function(){ 
 console.log(this.title); 
}; 

//我們可以用ES6把語(yǔ)法簡(jiǎn)化如下:
class Book { //{2} 
 constructor (title, pages, isbn) { 
 this.title = title; 
 this.pages = pages; 
 this.isbn = isbn; 
 } 
 printIsbn(){ 
 console.log(this.isbn); 
 } 
} 

class ITBook extends Book { //{1} 
 constructor (title, pages, isbn, technology) { 
 super(title, pages, isbn); //{2} 
   this.technology = technology; 
 } 
 printTechnology(){ 
  console.log(this.technology); 
 } 
} 
let jsBook = new ITBook('學(xué)習(xí)JS算法', '200', '1234567890', 'JavaScript'); 
console.log(jsBook.title); 
console.log(jsBook.printTechnology()); 


/**
 * 堆棧:是具有一定操作約束的線(xiàn)性表虑鼎,只在一端做插入和刪除
 * 案例說(shuō)明:日常使用的是中綴表達(dá)式辱匿,而后綴表達(dá)式是利用堆棧
 * 特點(diǎn):后進(jìn)先出 LIFO,新插入的元素在棧頂,舊元素接近棧底
 * 抽象描述:
 *  1. 生成空的堆棧炫彩,最大長(zhǎng)度: createStack , maxSize
 *  2. 判斷堆棧是否已滿(mǎn)  isFull()
 *  3. 壓入堆棧  push()
 *  4. 判斷堆棧是否為空 isEmpty()
 *  5. 刪除并返回棧頂元素  Pop()
 * 
 *  以下是基于ES5實(shí)現(xiàn)
 *
 */
function Stack() {
    let items = [];  //私有變量匾七,多個(gè)Stack實(shí)例會(huì)創(chuàng)建多個(gè)items副本
    this.size = function () {
        return items.length;
    }
    this.push = function (element) {  //向棧添加元素
        items.push(element);
    },
        this.pop = function () {  //從棧中移除元素
            return items.pop();
        },
        this.peek = function () {  //查看棧頂元素
            return items[items.length - 1];
        },
        this.isEmpty = function () {  //檢查棧是否為空
            return items.length == 0;
        },
        this.clear = function () {  //清空棧
            items = []
        },
        this.print = function () {
            console.log(items.toString())
        }
}

let stack = new Stack();
console.log(stack);
stack.push('A')
stack.push('B')
stack.push('C')
stack.pop() //移除棧頂元素 C
stack.print() // A,B
console.log(`是否為空: ${stack.isEmpty()}`);  // false
console.log(`Stack的size: ${stack.size()}`);  // 2
console.log(`棧頂元素: ${stack.peek()}`);  //此時(shí)棧頂元素 B




ES6實(shí)現(xiàn)的方式

//第一種方式Symbol
let _items = Symbol()  //利用symbol創(chuàng)建私有屬性
class Stack {
    constructor() {
        this[_items] = [];
    }
    push(element) {
         this[_items].push(element)
    }
    pop(){
        this[_items].pop()
    }
    isEmpty(){
        return this[_items].length===0
    }
}

//第二種方式利用weakMap
let Stack = (function() {
  const items = new WeakMap(); //weakMap可以存儲(chǔ)鍵值對(duì),其中鍵是對(duì)象江兢,值可以是任意數(shù)據(jù)類(lèi)型
  class Stack {
    constructor() {
      items.set(this, []);
    }
    push(element) {
      let s = items.get(this);
      s.push(element);
    }
    pop() {
      let s = items.get(this);
      let r = s.pop();
      return r;
    }
    isEmpty() {
      return items.get(this).length === 0;
    }
    print() {
      console.log(items.get(this));
    }
  }
  return Stack; //返回類(lèi)的一個(gè)實(shí)例
})();

案例

function divideBy2(decNumber) {
  var remStack = new Stack();
  var rem = ""; //余數(shù)
  var binaryString = ""; //轉(zhuǎn)成二進(jìn)制后的
  while (decNumber > 0) {
    rem = Math.floor(decNumber % 2);
    remStack.push(rem);
    decNumber = Math.floor(decNumber / 2);
  }
  while (!remStack.isEmpty()) {
    binaryString += remStack.pop();
  }
  return binaryString;
}

console.log(divideBy2(100000));

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昨忆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子杉允,更是在濱河造成了極大的恐慌邑贴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叔磷,死亡現(xiàn)場(chǎng)離奇詭異拢驾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)改基,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)繁疤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秕狰,你說(shuō)我怎么就攤上這事稠腊。” “怎么了鸣哀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵架忌,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我我衬,道長(zhǎng)叹放,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任低飒,我火速辦了婚禮许昨,結(jié)果婚禮上懂盐,老公的妹妹穿的比我還像新娘褥赊。我一直安慰自己,他們只是感情好莉恼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布拌喉。 她就那樣靜靜地躺著速那,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尿背。 梳的紋絲不亂的頭發(fā)上端仰,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音田藐,去河邊找鬼荔烧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汽久,可吹牛的內(nèi)容都是我干的鹤竭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼景醇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼臀稚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起三痰,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吧寺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后散劫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稚机,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年获搏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抒钱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颜凯,死狀恐怖谋币,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情症概,我是刑警寧澤蕾额,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站彼城,受9級(jí)特大地震影響诅蝶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜募壕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一调炬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舱馅,春花似錦缰泡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缠借。三九已至,卻和暖如春宜猜,著一層夾襖步出監(jiān)牢的瞬間泼返,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工姨拥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绅喉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓叫乌,卻偏偏與公主長(zhǎng)得像霹疫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子综芥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354