棧和隊列

是什么

棧和隊列是2種重要的線性結(jié)構(gòu)。

  • 從數(shù)據(jù)結(jié)構(gòu)看斯嚎,棧和隊列也是線性表利虫,其特殊性在于它們的操作受限,可以當(dāng)成操作受限的線性表堡僻。
  • 從數(shù)據(jù)類型看列吼,它們是和線性表大不相同的2類重要的抽象數(shù)據(jù)類型。在面向?qū)ο蟮某绦蛟O(shè)計中苦始,它們是多型數(shù)據(jù)類型寞钥。

棧的定義和常用方法的實現(xiàn)

  • 棧(Stack)是限定僅在表尾進(jìn)行插入或者刪除操作的線性表。通常陌选,表尾端稱為棧頂(top),表頭稱為棧底(bottom);不包含元素的空表稱為空棧理郑。
  • 棧的修改是按“后進(jìn)先出”的原則進(jìn)行的
  • 棧的存儲結(jié)構(gòu)
    • 順序存儲結(jié)構(gòu)
    • 鏈?zhǔn)酱鎯Y(jié)構(gòu)

順序棧(順序存儲結(jié)構(gòu))

  • 是利用一組連續(xù)的存儲單元一次存放自棧底到棧頂?shù)臄?shù)據(jù)元素,同時設(shè)定指針top指示棧頂?shù)臄?shù)據(jù)元素咨油,同時設(shè)定指針top指示棧頂元素的位置您炉。空棧的棧頂指定值為NULL役电,

實現(xiàn)順序棧的常見操作

  • Inistack(stack),初始化話一個線性堆棧赚爵,即可返回一個Javascript數(shù)組聲明。
function Inistack(stack) {
  stack = new Array();
  return stack;
}
  • Empty(stack),判斷線性堆棧是否為空法瑟。
function Empty(stack) {
  var returnValue = false;
  if (stack.length == 0) returnValue = true;
  return returnValue;
}
  • Push(stack, x),壓入棧操作,將x元素追加放到存儲線性堆棧的數(shù)組的最后冀膝。
function Push(stack,x){
  var returnValue = 0;
  var stackLength = stack.length;
  stack[stackLength] = x;
  return stackLength;
}
  • Pop(stack),彈出棧操作。即將存儲線性堆棧的數(shù)組的最后一個元素值返回霎挟,并將數(shù)組長度減1.
// 彈出線性堆棧操作
function Pop() {
  var returnValue = null;
  var stackLength = stack.length;
  if(stackLength >= 1) {
    returnValue = stack[stackLength-1];
    stack.length = stackLength - 1;  // 減少元素個數(shù)
  }
  return returnValue;
}
  • Gettop(stack),獲取棧頂元素的值窝剖,即將存儲線性堆棧的數(shù)組的最后一個元素值返回即可
function Gettop() {
  var returnValue = null;
  var stackLength = stack.length;
  returnValue = stack[stackLength-1];
  return returnValue;
}
  • Clear(stack),清空線性堆棧操作。即將存儲線性堆棧的數(shù)組的長度設(shè)置為0即可
// 清空線性堆棧
function Clear(stack) {
  stack.length = 0;
  return true;
}
  • Current_size(stack),獲得線性堆棧的當(dāng)前大小酥夭。即將存儲線性堆棧的數(shù)組的長度返回即可
function Current_size(stack) {
  return stack.length;
}

范例

假設(shè)要做一個文本錄入程序赐纱,為了使程序簡單,我們規(guī)定程序只能輸入26個字母熬北,還能使用回退鍵刪除一個字母疙描。例如,在鍵盤上輸入如下字符序列: "chii<nai<",其中<表示回退鍵讶隐,最后輸出的應(yīng)該是"china"起胰。為此需要設(shè)置一個線性棧來保存從鍵盤上錄入的信息。每當(dāng)從鍵盤上錄入一個非回退鍵時整份,就將該字符串壓入堆棧待错,如果從鍵盤上輸入一個回車鍵,則從堆棧中彈出一個字符烈评。最后在線性堆棧中的就是所需要錄入的正確信息火俄。

var input_stack = new Array();
function key_input(event, stack) {
  if(((event.keyCode>=65)&&(event.keyCode<=90))  || (event.keyCode==8)) {
    if(event.keyCode == 8) {
      Pop(stack);
    } else {
      Push(stack, keyCode2Char(event.keyCode));
    }
}
  printStack(stack);
}

// 打印一個線性堆棧的值
function printStack(stack) {
  var printMsg = "";
  for(var i = 0; i < stack.length; i++) {
    printMsg = printMsg + "' " + stack[i] + " , ";
  }
  alert(printMsg);
}

// 將keyCode轉(zhuǎn)換為字符的函數(shù)
function keyCode2Char(keycode) {
  var charArray = "a, b , c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z".split(", ");
  return charArray[keyCode-65];
}

分糖果

排排坐,分糖果讲冠。

我們買了一些糖果 candies瓜客,打算把它們分給排好隊的 n = num_people 個小朋友。

給第一個小朋友 1 顆糖果竿开,第二個小朋友 2 顆谱仪,依此類推,直到給最后一個小朋友 n 顆糖果否彩。

然后疯攒,我們再回到隊伍的起點(diǎn),給第一個小朋友 n + 1 顆糖果列荔,第二個小朋友 n + 2 顆敬尺,依此類推,直到給最后一個小朋友 2 * n 顆糖果贴浙。

重復(fù)上述過程(每次都比上一次多給出一顆糖果砂吞,當(dāng)?shù)竭_(dá)隊伍終點(diǎn)后再次從隊伍起點(diǎn)開始),直到我們分完所有的糖果崎溃。注意蜻直,就算我們手中的剩下糖果數(shù)不夠(不比前一次發(fā)出的糖果多),這些糖果也會全部發(fā)給當(dāng)前的小朋友袁串。

返回一個長度為 num_people概而、元素之和為 candies 的數(shù)組,以表示糖果的最終分發(fā)情況(即 ans[i] 表示第 i 個小朋友分到的糖果數(shù))囱修。


/**
 * @param {number} candies
 * @param {number} num_people
 * @return {number[]}
 */
var distributeCandies = function(candies, num_people) {
    var arr = new Array(num_people).fill(0);
    var n = 1
    while(candies!==0) {
        
        for (let i = 0; i< arr.length; i++) {
            if(candies-n > 0) {
                arr[i] += n;
                candies = candies-n
                n++;
            } else {
                arr[i] += candies;
                candies = 0;
            }
        }
    }
    return arr;

};

隊列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末到腥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔚袍,更是在濱河造成了極大的恐慌乡范,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啤咽,死亡現(xiàn)場離奇詭異晋辆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宇整,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門瓶佳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳞青,你說我怎么就攤上這事霸饲∥螅” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵厚脉,是天一觀的道長习寸。 經(jīng)常有香客問我,道長傻工,這世上最難降的妖魔是什么霞溪? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮中捆,結(jié)果婚禮上鸯匹,老公的妹妹穿的比我還像新娘。我一直安慰自己泄伪,他們只是感情好殴蓬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟋滴,像睡著了一般科雳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脓杉,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天糟秘,我揣著相機(jī)與錄音,去河邊找鬼球散。 笑死尿赚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕉堰。 我是一名探鬼主播凌净,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屋讶!你這毒婦竟也來了冰寻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤皿渗,失蹤者是張志新(化名)和其女友劉穎斩芭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乐疆,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡划乖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挤土。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琴庵。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迷殿,到底是詐尸還是另有隱情儿礼,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布庆寺,位于F島的核電站蚊夫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏止邮。R本人自食惡果不足惜这橙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一奏窑、第九天 我趴在偏房一處隱蔽的房頂上張望导披。 院中可真熱鬧,春花似錦埃唯、人聲如沸撩匕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽止毕。三九已至,卻和暖如春漠趁,著一層夾襖步出監(jiān)牢的瞬間扁凛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工闯传, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谨朝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓甥绿,卻偏偏與公主長得像字币,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子共缕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

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

  • 棧 棧的英文單詞是Stack,它代表一種特殊的線性表洗出,這種線性表只能在固定一端(通常認(rèn)為是線性表的尾端)進(jìn)行插入,...
    Jack921閱讀 1,503評論 0 5
  • 1.棧的定義 棧是一種特殊的線性表图谷。其特殊性在于限定插入和刪除數(shù)據(jù)元素的操作只能在線性表的一端進(jìn)行 結(jié)論:后進(jìn)先出...
    西西里的姑娘閱讀 454評論 0 0
  • 棧和隊列是兩種應(yīng)用非常廣泛的數(shù)據(jù)結(jié)構(gòu)翩活,它們都來自線性表數(shù)據(jù)結(jié)構(gòu),都是“操作受限”的線性表便贵。 棧 棧(Stack):...
    karlsu閱讀 658評論 0 1
  • 2017年3月3日 堅持早起120天隅茎,堅持寫時間管理第五天,寫于早晨5點(diǎn)6分嫉沽。 2015年是重慶社群開始的元年辟犀,包...
  • 作者:shihuaping0918@163.com,轉(zhuǎn)載請注明作者 skynet中的源碼已經(jīng)分析得差不多了,還有啟...
    天一閣圖書管理員閱讀 1,364評論 0 1