数组是计算机科学中最常用的数据结构,我们知道,我们可以在数组的任意位置上删除或者添加元素,然而,有时候我们还需要一种在添加和删除元素时有更多的控制数据结构。有两种数据结构类似于数组,但是在添加元素时更加可控。他们就是队列和栈。这里我们讲栈
什么是栈?
栈是一种遵循从后进先出(LIFO)原则的有序集合。新添加的或者等待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫做栈底。在栈里,新元素都靠近栈顶。旧元素都接近栈底。
栈的创建
我们将创建一个类来表示栈。让我们从基础开始。先声明这个类:
function Stack(){
//各种属性和方法的声明
}
首先,我们需要一种数据结构来保存栈当中的元素。我们这里可以选择数组
let item=[]
接下来,我们要为我们的栈声明一些方法:
-
push(element(s)):添加一个或者几个新元素到栈顶
-
pop():移除栈顶的元素,同时返回被移除的元素
-
peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回他)
-
isEmpty():如果栈里面没有任何元素就返回true,否则就返回false
-
clear():移除栈里的所有元素
-
size():返回栈当中的元素个数,这个方法和length属性类似
代码实现
class Stack{ constructor(){ this.dataStore=[] } push(key){ this.dataStore.push(key) } pop(){ return this.dataStore.pop() } peek(){ return this.dataStore[this.dataStore.length-1] } isEmpty(){ return this.dataStore.length===0?true:false } clear(){ this.dataStore=[] } size(){ return this.dataStore.length } toString(){ let s='栈的元素为:' for(let i=0;i<this.dataStore.length;i++){ if(i===this.dataStore.length-1){ s+=`${this.dataStore[i]}` }else{ s+=`${this.dataStore[i]}=>` } } return s }}function fn(){ let stack=new Stack() stack.push(1) stack.push(2) stack.push(3) stack.push(4) console.log(stack.toString()) console.log(stack.pop()) console.log(stack.toString()) console.log(stack.peek()) console.log(stack.isEmpty()) console.log(stack.clear()) console.log(stack.isEmpty())}fn()
栈解决了什么问题?
客户输入一个10进制数,再输入一个他需要转化为的进制数,然后我们编写一个函数,对10进制数进行处理,最后返回客户需要的进制数
// 进制转化 parseStack(num1,num2){ if(num1===0){ return num1 } while(num1!==0){ this.dataStore.push(num1%num2) num1=Math.floor(num1/num2) } return this.dataStore } parseStackToString(){ let s='' while(this.dataStore.length!==0){ s+=this.dataStore.pop() } return parseInt(s); }