JavaScript實(shí)現(xiàn)棧結(jié)構(gòu)詳細(xì)過程
一、認(rèn)識(shí)棧結(jié)構(gòu)
我們知道數(shù)組是一種常見的數(shù)據(jù)結(jié)構(gòu),并且可以在數(shù)組的任意位置插入和刪除數(shù)據(jù),但是有時(shí)候,我們?yōu)榱藢?shí)現(xiàn)某些功能,必須對(duì)這種任意性加以限制,而棧和隊(duì)列就是比較常見的受限的數(shù)據(jù)結(jié)構(gòu),我們先來看看棧。
棧(stack),它是一種受限的線性表,后進(jìn)先出(LIFO)
- 其限制性是允許在表的一端進(jìn)行插入和刪除運(yùn)算。這一端被稱為棧頂,相對(duì)的,把另一端,稱為棧底。
LIFO(last in first out)表示就是后進(jìn)入的元素,第一個(gè)彈出棧空間。- 向一個(gè)棧中插入一個(gè)新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;
- 從一個(gè)棧刪除元素又稱作出棧或者退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
其結(jié)構(gòu)圖如下所示:

生活中類似于棧的
例如:當(dāng)我們敲代碼時(shí),如果發(fā)生錯(cuò)誤需要?jiǎng)h除,那么最先敲上去的是最后被刪除的。
接下來我們就一起來實(shí)現(xiàn)一下棧結(jié)構(gòu)的封裝,將采用的方式是基于數(shù)組實(shí)現(xiàn)的。
二、棧結(jié)構(gòu)封裝
首先創(chuàng)建一個(gè)類封裝棧結(jié)構(gòu),如下:
function Stack(){
}
在其內(nèi)部添加屬性和方法,將數(shù)組通過屬性的方法添加給該類。然后采用原型的方法添加常用的操作。
棧常用的操作有:
push(element):添加一個(gè)新元素到棧頂位置。pop():移除棧頂?shù)脑?/li>peek( ):返回棧頂?shù)脑?,不?duì)棧做任何修改isEmpty():判斷棧是否空,如果棧里沒有任何元素,則返回true,否則返回falsesize():返回棧里的元素個(gè)數(shù)toString():將棧結(jié)構(gòu)的內(nèi)容以字符形式返回
接下來,我們就來將他們一一實(shí)現(xiàn):
function Stack(){
this.items = [];
// 添加一個(gè)新元素到棧頂位置。push()
Stack.prototype.push = function(element){
this.items.push(element);
}
// 移除棧頂?shù)脑豴op()
Stack.prototype.pop = function(){
return this.items.pop();
}
// 返回棧頂?shù)脑?,不?duì)棧做任何修改peek()
Stack.prototype.peek = function(){
return this.items[this.items.length-1];
}
// 判斷棧是否空isEmpty()
Stack.prototype.isEmpty = function(){
if(this.items.length == 0){
return true;
}else {
return false;
}
}
// 返回棧里的元素個(gè)數(shù)size()
Stack.prototype.size = function(){
return this.items.length;
}
// 將棧結(jié)構(gòu)的內(nèi)容以字符形式返回toString()
Stack.prototype.toString = function(){
var str = '';
for(var i =0;i<this.items.length;i++){
str += this.items[i] + ' ';
}
return str;
}
}
注意:這里為什么要通過原型的方式添加呢?是因?yàn)橥ㄟ^該方法添加的方法是添加在類上的,而如果直接通過this來添加,是添加到具體的實(shí)例對(duì)象上的,會(huì)造成浪費(fèi)內(nèi)存的情況。
最后進(jìn)行驗(yàn)證。代碼如下:
var stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
console.log(stack);
console.log('移除的棧頂元素是:'+stack.pop());
console.log('棧頂元素為:'+stack.peek());
console.log('棧是否為空:'+stack.isEmpty());
console.log('棧里的元素個(gè)數(shù)是:'+stack.size());
console.log('棧結(jié)構(gòu)的內(nèi)容是:');
console.log(stack.toString());
輸出結(jié)果為:

構(gòu)建成功。
接下來來看一個(gè)實(shí)例!
三、十進(jìn)制轉(zhuǎn)化為二進(jìn)制
如何實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)化為二進(jìn)制呢?
要把十進(jìn)制轉(zhuǎn)化成二進(jìn)制,我們可以將該十進(jìn)制數(shù)字和2整除,將得到的余數(shù)壓入棧中,直到結(jié)果是0為止,最后在將得到的棧中元素依次出棧,得到最終結(jié)果,
如下圖所示:

具體代碼為:
function Stack(){
this.items = [];
//入棧
Stack.prototype.push = function(element){
this.items.push(element);
}
//出棧
Stack.prototype.pop = function(){
return this.items.pop();
}
//判斷棧是否為空
Stack.prototype.isEmpty = function(){
if(this.items.length == 0){
return true;
}else{
return false;
}
}
}
function decToBin(decNumber){
var stack = new Stack;
while(decNumber>0){
//獲取余數(shù),放入棧中
stack.push(decNumber%2);
//獲取新的除數(shù)
decNumber = Math.floor(decNumber/2);
}
//獲取棧頂元素
var str = '';
while(!stack.isEmpty()){
str += stack.pop();
}
return str;
}
console.log('100轉(zhuǎn)化成二進(jìn)制是:'+decToBin(100));
console.log('50轉(zhuǎn)化成二進(jìn)制是:'+decToBin(50));
console.log('20轉(zhuǎn)化成二進(jìn)制是:'+decToBin(20));
console.log('34轉(zhuǎn)化成二進(jìn)制是:'+decToBin(34));
輸出結(jié)果為:

到此這篇關(guān)于JavaScript實(shí)現(xiàn)棧結(jié)構(gòu)詳細(xì)過程的文章就介紹到這了,更多相關(guān)JavaScript實(shí)現(xiàn)棧結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)放大鏡詳細(xì)
這篇文章主要介紹了js實(shí)現(xiàn)放大鏡,借助寬高等比例放大的兩張圖片,結(jié)合js中鼠標(biāo)偏移量、元素偏移量、元素自身寬高等屬性完成;左側(cè)遮罩移動(dòng)Xpx,右側(cè)大圖移動(dòng)X*倍數(shù)px,具體內(nèi)容請(qǐng)需要的小伙伴出差下面文章內(nèi)容2021-12-12
項(xiàng)目中使用TypeScript的TodoList實(shí)例詳解
這篇文章主要為大家介紹了項(xiàng)目中使用TypeScript的TodoList實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
實(shí)現(xiàn)微信小程序的wxml文件和wxss文件在webstrom的支持
這篇文章主要介紹了實(shí)現(xiàn)微信小程序的wxml文件和wxss文件在webstrom的支持的相關(guān)資料,需要的朋友可以參考下2017-06-06
axios?攔截器管理類鏈?zhǔn)秸{(diào)用手寫實(shí)現(xiàn)及原理剖析
這篇文章主要為大家介紹了axios?攔截器管理類鏈?zhǔn)秸{(diào)用手寫實(shí)現(xiàn)及原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
微信小程序 swiper制作tab切換實(shí)現(xiàn)附源碼
這篇文章主要介紹了微信小程序 swiper制作tab切換實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
微信小程序 動(dòng)畫的簡(jiǎn)單實(shí)例
這篇文章主要介紹了微信小程序 動(dòng)畫的簡(jiǎn)單實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10
JS中的every()對(duì)空數(shù)組總返回true原理分析
這篇文章主要為大家介紹了JS中的every()對(duì)空數(shù)組總返回true原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

