为什么要学习数据结构与算法
1.数据结构+算法=程序
2.代码化繁为简
3.提高代码性能
4.提高面试通过率
栈
栈的概念
- 栈是一种遵从后进先出原则的有序集合
- 添加新元素的一端称为栈顶,另一端称为栈底
- 操作栈的元素时,只能从栈顶操作(添加、移除或取值)
栈的实现
- push()入栈方法
- pop()出栈方法
- top()获取栈顶值
- size()获取栈的元素个数
- clear()清空栈
class Stack {
constructor () {
this.data = {}
this.count = 0
}
push (item) {
this.data[this.count] = item
this.count++
}
pop () {
if (this.isEmpty()) {
console.log('栈为空!')
return
}
const temp = this.data[this.count - 1]
delete this.data[--this.count]
return temp
}
isEmpty () {
return this.count === 0
}
top () {
if (this.isEmpty()) {
console.log('栈为空!')
return
}
return this.data[this.count - 1]
}
size () {
return this.count
}
clear () {
this.data = []
this.count = 0
}
}
const s = new Stack()
s.push('a')
s.push('b')
s.push('c')
每日温度(LeetCode精选题目)
var dailyTemperatures = function(T) {
const stack = [0]
let count = 1
const len = T.length
const arr = new Array(len).fill(0)
for (let i = 1; i < len; i++) {
let temp = T[i]
while (count && temp > T[stack[count - 1]]) {
let index = stack.pop()
count--
arr[index] = i - index
}
stack.push(i)
count++
}
return arr
}
队列
队列的概念
- 队列是一种遵从先进先出原则的有序集合
- 添加新元素的一端称为队尾,另一端称为队首
队列的实现
- enqueue()入队方法
- dequeue()出队方法
- top()获取队首值
- size()获取队列的元素个数
- clear()清空队列
class Queue {
constructor () {
this.queue = []
this.count = 0
}
enQueue (item) {
this.queue[this.count++] = item
}
deQueue () {
if (this.isEmpty()) {
return
}
this.count--
return this.queue.shift()
}
isEmpty () {
return this.count === 0
}
top () {
if (this.isEmpty()) {
return
}
return this.queue[0]
}
size () {
return this.count
}
clear () {
this.length = 0
this.count = 0
}
}
const q = new Queue()
双端队列
双端队列指的是允许同时从队尾和队首两端进行存取操作的队列,操作更加灵活
双端队列与JavaScript中的数组操作十分相似,只是不允许在数组两端以外的位置进行存取操作
双端队列实现
- addFront/addBack
- removeFront/removeBack
- frontTop/backTop
class Deque {
constructor () {
this.queue = {}
this.count = 0
this.head = 0
}
addFront (item) {
this.queue[--this.head] = item
}
addBack (item) {
this.queue[this.count++] = item
}
removeFront () {
if (this.isEmpty()) {
return
}
const headData = this.queue[this.head]
delete this.queue[this.head++]
return headData
}
removeBack () {
if (this.isEmpty()) {
return
}
const backData = this.queue[this.count - 1]
delete this.queue[--this.count]
return backData
}
frontTop () {
if (this.isEmpty()) {
return
}
return this.queue[this.head]
}
backTop () {
if (this.isEmpty()) {
return
}
return this.queue[this.count - 1]
}
isEmpty () {
return this.size() === 0
}
size () {
return this.count - this.head
}
}
const deq = new Deque()
队列的最大值(LeetCode精选题目)
var MaxQueue = function() {
this.queue = {}
this.deque = {}
this.countQ = this.countD = this.headQ = this.headD = 0
};
MaxQueue.prototype.push_back = function(value) {
this.queue[this.countQ++] = value
while (!this.isEmptyDeque() && value > this.deque[this.countD - 1]) {
delete this.deque[--this.countD]
}
this.deque[this.countD++] = value
};
MaxQueue.prototype.pop_front = function() {
if (this.isEmptyQueue()) {
return - 1
}
if (this.queue[this.headQ] === this.deque[this.headD]) {
delete this.deque[this.headD++]
}
const frontData = this.queue[this.headQ]
delete this.queue[this.headQ++]
return frontData
};
MaxQueue.prototype.max_value = function() {
if (this.isEmptyDeque()) {
return -1
}
return this.deque[this.headD]
};
MaxQueue.prototype.isEmptyDeque = function () {
return !(this.countD - this.headD)
};
MaxQueue.prototype.isEmptyQueue = function () {
return !(this.countQ - this.headQ)
};
滑动窗口的最大值(LeetCode精选题目)
var maxSlidingWindow = function(nums, k) {
if (k <= 1) {
return nums
}
const result = []
const deque = []
deque.push(nums[0])
let i = 1
for (; i < k; i++) {
while (deque.length && nums[i] > deque[deque.length - 1]) {
deque.pop()
}
deque.push(nums[i])
}
result.push(deque[0])
const len = nums.length
for (; i < len; i++) {
while (deque.length && nums[i] > deque[deque.length - 1]) {
deque.pop()
}
deque.push(nums[i])
if (deque[0] === nums[i - k]) {
deque.shift()
}
result.push(deque[0])
}
return result
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)