手动实现数据结构-栈结构
1.栈结构
-
是一种受限的线性结构。
-
特点:先进后出
2.使用TS实现
//封装一个栈 使用泛型类
class ArrayStack<T=any>{//给一个默认值为any类型
//定义一个数组,用于存储元素
private data:T[]=[]
//push:将元素压入栈中
push(e:T):void{
this.data.push(e)
}
//pop方法:将栈顶的元素弹出栈(返回出去并从栈顶移除)
pop():T|undefined{
return this.data.pop()//pop返回的是删除的元素
}
//peek方法:看一眼栈顶元素
peek():T|undefined{
return this.data[this.data.length-1]
}
//isEmpty
isEmpty():boolean{
return this.data.length===0
}
size():number{
return this.data.length
}
}
3.使用JS实现
// 栈类
function Stack() {
// 栈中的属性
var items = []
// 栈相关的方法
// 压栈操作
this.push = function (element) {
items.push(element)
}
// 出栈操作
this.pop = function () {
return items.pop()
}
// peek操作
this.peek = function () {
return items[items.length - 1]
}
// 判断栈中的元素是否为空
this.isEmpty = function () {
return items.length == 0
}
// 获取栈中元素的个数
this.size = function () {
return items.length
}
}
4.相关题目
-
十进制转二进制
function decToBinary(decimal:number):string{ let stack=new ArrayStack<number>() //while:不知道循环次数,知道循环终止条件。for:知道循环次数 while(decimal>0){ let result=decimal%2 stack.push(result) decimal=Math.floor(decimal/2) } let str='' while(!stack.isEmpty()){ str+=stack.pop() } return str } -
有效的括号
function isVaild(str:string):boolean{
//创建一个栈结构 用于把存放右括号
let stack=new ArrayStack()
//遍历字符串中每一个字符,当遇到一个左括号就往栈里面添加对应的右括号。当遇到右括号时,就能让它与栈弹出的元素(刚添加进去的)比较,如果不相等,就说明没有成对出现。重要的就是一一对应(相应的左括号对应相应的右括号)。
for(let i=0;i<str.length;i++){
let item=str[i]
switch(item){
case '(':
stack.push(')')
break;
case '{':
stack.push('}')
break;
case '[':
stack.push(']')
break;
default:
if(item!==stack.pop())return false
break;
}
}
//只有栈为空的时候,表明括号既一一对应又是双数
return stack.isEmpty()
}