PVZ理論中的棧究竟是什么 計(jì)算機(jī)存儲(chǔ)-棧
棧,一種計(jì)算機(jī)的存儲(chǔ)類(lèi)型。在pvz中運(yùn)用廣泛,舞王識(shí)別伴舞,小偷偷植物,種植紫卡等等都是使用棧做到的
現(xiàn)在雖然知道棧在pvz里使用的很多,但是不了解其中的規(guī)律仍然沒(méi)有用,如果直接講??隙〞?huì)無(wú)比抽象,所以我們把棧畫(huà)出來(lái)

現(xiàn)在對(duì)比下面兩圖,找一下他們的區(qū)別


可以發(fā)現(xiàn)上圖左邊封了口,而下圖沒(méi)有。上圖所代表是另一個(gè)的計(jì)算機(jī)存儲(chǔ)類(lèi)型:列表。就是這小小的區(qū)別成為了棧最大的特點(diǎn)
現(xiàn)在對(duì)比一下從列表中拿出一個(gè)2和從棧中拿出一個(gè)2的區(qū)別


可以發(fā)現(xiàn)列表可以直接取出2,而棧需要把2左邊所有的數(shù)據(jù)拿出才能取出2

這就是棧的特點(diǎn),不能直接取出中間的數(shù)據(jù),必須從左邊拿出,這可以總結(jié)出一個(gè)規(guī)律:后進(jìn)先出
現(xiàn)在我們知道了棧是什么和棧的特點(diǎn),那么現(xiàn)在就應(yīng)該研究棧在pvz中的運(yùn)用了
在pvz中種下三顆植物,順序是:向日葵 豌豆射手 堅(jiān)果。此時(shí)3個(gè)植物獲得的序號(hào)和棧的情況如下


可以發(fā)現(xiàn),最先種的植物可以拿到最左邊的棧,那此時(shí)鏟掉豌豆射手看看棧的變化


豌豆射手的所獲取的序號(hào)又回到了棧中,繼續(xù)鏟植物


鏟掉堅(jiān)果后,堅(jiān)果的序號(hào)也回到了棧中,那么現(xiàn)在中個(gè)雙發(fā)它的序號(hào)是什么


雙發(fā)獲得了原本屬于堅(jiān)果的序號(hào)2,而更小的1因?yàn)闂5奶攸c(diǎn)沒(méi)被取出來(lái)?,F(xiàn)在我們知道了pvz是如何運(yùn)用棧,但在實(shí)戰(zhàn)中有什么用呢
實(shí)戰(zhàn)沖關(guān)時(shí),打無(wú)炮和少炮往往會(huì)遇到需要墊巨人的情況,為什么有的時(shí)候巨人會(huì)先砸墊材有的時(shí)候先砸永久性植物,這其實(shí)也和棧有關(guān)系
現(xiàn)在我們先放一個(gè)曾再放一個(gè)噴,此時(shí)小噴的棧比曾大

現(xiàn)在放一個(gè)巨人模擬實(shí)戰(zhàn)發(fā)生的墊巨人

看看結(jié)果,序號(hào)小的曾被砸了,而應(yīng)該是墊材的小噴還在

由此可以知道,僵尸先攻擊棧更低的植物,那么除了墊巨人以外還有什么用處嗎?
答案是肯定的,藝術(shù)開(kāi)局的抽荷葉與抽花盆都用到了棧


小偷根據(jù)棧來(lái)識(shí)別自己偷的植物,只要用一些特殊手法騙過(guò)小偷,讓另一個(gè)植物和小偷所偷的植物的序號(hào)一樣,并且原本要偷的植物消失了,那么小偷則會(huì)偷那個(gè)序號(hào)與原目標(biāo)的序號(hào)一樣的植物,這也就是小偷的棧位理論
不僅植物,僵尸也同樣是用棧,舞王是如何
識(shí)別哪個(gè)伴舞是自己的呢?答案是使用棧
看看下面的兩個(gè)視頻
視頻皆來(lái)于大佬 李華的27號(hào)速記員


視頻中的舞王為什么不召喚伴舞呢?


這是因?yàn)橥ㄟ^(guò)棧讓舞王的識(shí)別出錯(cuò),上圖的舞王把魅惑普僵識(shí)別成了自己的伴舞,下圖的舞王把另一個(gè)舞王召喚的伴舞識(shí)別成了自己的伴舞,在已經(jīng)有伴舞(對(duì)于舞王說(shuō)已經(jīng)有了)的情況下舞王當(dāng)然不會(huì)再次召喚
這就是棧在實(shí)戰(zhàn)中的運(yùn)用。除了無(wú)盡,在ize也有許多用處,因?yàn)槲也](méi)有深究過(guò)ize所以不寫(xiě)

接下來(lái)是對(duì)于棧更為深層講解,對(duì)于pvz的用處已經(jīng)不是很大了,最好有一定編程基礎(chǔ)
棧(Stack)是一種線(xiàn)性存儲(chǔ)結(jié)構(gòu),雖然為了方便理解我把他畫(huà)成橫向的,但實(shí)際的棧應(yīng)該是這樣的

棧的最頂部也被稱(chēng)為棧頂,棧頂也是允許拿出和放入數(shù)據(jù)的一端,而棧頂?shù)牧硪欢藙t是棧底
把數(shù)據(jù)放入棧的操作被稱(chēng)為入棧or進(jìn)棧
把數(shù)據(jù)拿出棧的操作被稱(chēng)為出棧
因?yàn)闂5奶厥庑?,所以棧不能像變量和列表那樣直接拿出或放入?shù)據(jù)
一般入棧的操作命名為push出棧的操作命名為pop
除了入棧和出棧,我們還可以對(duì)棧進(jìn)行如下操作
以C++為例,不同語(yǔ)言會(huì)有不同寫(xiě)法
返回棧頂數(shù)據(jù): 棧名.top()
返回棧的大小(棧中所擁有的數(shù)據(jù)量):棧名.size()
判定棧是否為空,若是則返回true,若不是則返回false: 棧名.empty()