程序猿日志——數(shù)據(jù)結(jié)構(gòu):棧

導(dǎo)語:
近期打算開一系列基于JavaScript的數(shù)據(jù)結(jié)構(gòu)和算法的文章,這一系列文章屬于小羊的計算機(jī)基礎(chǔ)文集的范疇,目的是夯實編程的基礎(chǔ)。

目錄

1. 建立基本認(rèn)識
2. 環(huán)境搭建
3. 棧

學(xué)習(xí)是有目的的,那么學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的目的是什么?我不禁自問?

建立基本認(rèn)識

學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法僅僅是為了擴(kuò)展知識面,那么可學(xué)的東西多的去了,為什么偏偏選中這兩者呢?所以理由不成立!

學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法是為了鍛煉思維,那么倒不如參加一個腦力訓(xùn)練營來的行之有效!

所以,我給自己一個學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的理由是為了編程思維的增進(jìn)!

往往學(xué)習(xí)到一定階段的程序猿,比如我就會陷入一定的瓶頸,對于項目涉及到復(fù)雜的功能,往往感覺十分不好下手,為什么,因為沒有建立好一個良好的編程思維,思維不清晰,代碼無法下手!

因此,解決這一問題,還需要理解程序是什么入手

程序是什么

程序是為了求解問題而生!
我們寫的每一個程序都是為了解決特定的問題,那么我們就需要一個套路去實現(xiàn)從現(xiàn)實中獲取問題到編寫程序解決問題的思維過程;

計算機(jī)問題求解概念模型

舉個栗子:

一列火車通過一座長300米的鐵橋.完全通過所用的時間為20秒.完全在橋上的時間為10秒.求火車的車長以及它的速度.

  • 問題:就是上述用自然語言描述的問題,也是我們在工作中遇到各種各樣問題的自然語言表達(dá);
  • 問題分析:直接基于自然語言分析問題,不同人容易產(chǎn)生不同理解,從而無法統(tǒng)一問題規(guī)范;因此通過形式化或抽象化的思維方式,統(tǒng)一描述規(guī)范,然后大伙都看的懂,最后采用數(shù)理化方法建立數(shù)學(xué)模型,為后面設(shè)計程序奠定基礎(chǔ);
問題的形式化
數(shù)學(xué)模型:2個約束條件
  • 算法設(shè)計:求解上述問題的解決步驟,算法作為一種解題思維需要載體去表現(xiàn),因此算法的表現(xiàn)形式可分為自然語言、程序流程圖和偽代碼,其中自然語言適合描述宏觀的問題求解步驟,程序流程圖和偽代碼分別從形象化和程序化角度描述具體的問題求解方法;
    這里采用偽代碼形式去進(jìn)行算法設(shè)計
//要求出火車車長l,和速度v,根據(jù)已知約束條件
//采用窮舉法,算法類型的一種,特點是將每一種結(jié)果都能進(jìn)行測試,一定可以得到問題的解,缺點是計算規(guī)模隨計算復(fù)雜度提升而驟增
v=0
l = 0
while(true){
  if(300-2l === 10v) break
  v++
  l =20v-300
}
console.log(v,l)

上面使用了窮舉法的算法類型,具體算法類型還包括遞推法、回溯法、分治法、貪心法、動態(tài)規(guī)范法、遞歸和迭代法,算法設(shè)計完之后還要進(jìn)行算法分析,分析的指標(biāo)包括時間復(fù)雜度和空間復(fù)雜度;

  • 數(shù)據(jù)設(shè)計:算法設(shè)計中離不開數(shù)據(jù),程序運(yùn)行的過程就是數(shù)據(jù)處理的過程,程序運(yùn)行完畢要么返回一個值,要么產(chǎn)生副作用(比如標(biāo)準(zhǔn)輸出)。采用合適的數(shù)據(jù)結(jié)構(gòu)對提高程序性能極其重要,數(shù)據(jù)結(jié)構(gòu)可以包括數(shù)據(jù)的邏輯結(jié)構(gòu)和存儲結(jié)構(gòu),邏輯結(jié)構(gòu)可分為集合、線性表、樹形結(jié)構(gòu)、圖結(jié)構(gòu),存儲結(jié)構(gòu)可分為順序結(jié)構(gòu)和鏈?zhǔn)浇Y(jié)構(gòu),這些概念以后會詳談;
  • 程序:有了算法和數(shù)據(jù)結(jié)構(gòu),就可以結(jié)合特定的編程語言寫程序,以JavaScript為例
function app(){
  var velocity=0,length;
    while(true){
      velocity++
      length = 20*velocity-300
      if(300-2*length === velocity*10) break
  }
  console.log('車的長度:'+ length,'車的速度:'+velocity)
}
app()
//"車的長度:60"
//"車的速度:18"
  • 程序運(yùn)行與問題的解:通過上面的套路,將一個自然語言描述的問題,通過問題的抽象和形式化,然后利用數(shù)學(xué)工具進(jìn)行數(shù)學(xué)建模,將數(shù)學(xué)模型從算法和數(shù)據(jù)結(jié)構(gòu)兩方面進(jìn)行設(shè)計,得到適合編程的語言描述,最終編寫出程序并運(yùn)行,問題求解完成;

環(huán)境搭建
  • 編輯器:有個不錯的編輯器去寫代碼;
  • 瀏覽器:瀏覽器是JavaScript的解釋器和運(yùn)行環(huán)境;
  • Node:有個Node也不錯,可以不用打開瀏覽器,一個Node命令直接跑代碼;

棧是我們要學(xué)習(xí)的第一個數(shù)據(jù)結(jié)構(gòu),先了解一下什么是棧?
棧可以理解為時一種受限的數(shù)組,遵從后進(jìn)先出原則的有序集合,比如一摞書,你最先拿得到的一般是最上面的書,放一本新書也是放在最上面;

數(shù)據(jù)結(jié)構(gòu):棧
//創(chuàng)建一個類表示棧
function Stack(){
  var items = []//聲明一個數(shù)據(jù)結(jié)構(gòu)保存棧元素
  //每次將元素談添加到棧頂
  this.push = function(){
     var elems = [].slice.call(arguments)
      elems.map((item)=>{
        items.push(item)
    })
  }
  //每次從棧頂刪除元素并返回該元素
  this.pop = function(){
    return items.pop()
  }
  //獲取棧頂?shù)脑?  this.peek = function(){
    return items[items.length-1]
  }
  //判斷是否為空棧
  this.isEmpty = function(){
    return items.length == 0
  }
  //清空棧
  this.clear = function(){
    items = []
  }
  //獲取棧元素的個數(shù)
  this.size = function(){
    return items.length
  }
  //標(biāo)準(zhǔn)輸出棧
  this.print = function(){
    console.log(items)
  }
}
測試用例
var stack = new Stack()
stack.isEmpty()//true
stack.push('foo')
stack.push('bar','baz')
stack.print()//['foo','bar','baz']
stack.pop()//'baz'
stack.size()//2
stack.clear()
stack.print()//[]

小結(jié):

  • 程序猿日志的第一篇文章講解了數(shù)據(jù)結(jié)構(gòu)的棧結(jié)構(gòu),棧結(jié)構(gòu)是線性結(jié)構(gòu)的子集,線性結(jié)構(gòu)可分為線性表、堆棧(注意JS中的堆和棧是兩種存儲空間)、隊列;
  • 線性表可以看做是數(shù)組;
  • 堆棧,這里指棧,是本文主要探討的內(nèi)容,是一種受限的數(shù)組(線性表),棧中的元素的操作只能在棧頂進(jìn)行;
  • 本文還對為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行了簡單的闡述,通過計算機(jī)問題求解概念模型論證算法和數(shù)據(jù)結(jié)構(gòu)的重要性;

本文以及以后系列文章的代碼push在小羊的github地址,如有需要,可下載源碼;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容