js循环队列

export default class MyCircularQueue{
constructor (k){
//用来保存数据长度为k的数据结构
this.list=Array(k)
this.front=0//队首的指针
this.rear=0 //队尾的指针
this.max=k //队列的长度
}
enQueue(num){
if(this.isFull()){
return false
}else{
this.list[this.rear]=num
this.rear=(this.rear+1)%this.max
return true
}
}
deQueue(){
let v=this.list[this.front]
this.list[this.front]=''
this.front=(this.front+1)%this.max
return v
}
isEmpty(){
return this.front===this.rear&&!this.list[this.front]
}
isFull(){
return this.front===this.rear&&!!this.list[this.front]
}
Front(){
return this.list[this.front]
}
Rear(){
let rear=this.rear-1
return this.list[rear<0?this.max-1:rear]
}
}


export default(tasks,n)=>{
//表示最终队列执行的结果
let q=''
//对归类进行存储
let Q={}
tasks.forEach(item=>{
if(Q[item]){
Q[item]++
}else{
Q[item]=1
}
})
while(1){
// 任务清单
let keys=Object.keys(Q)
if(!keys[0]){
break
}
//声明一个队列用来存储1+n任务单元
let tmp=[]
for(let i=0;i<=n;i++){
let max=0
let key
let pos
keys.forEach((item,idx)=>{
if(Q[item]>max){
max=Q[item]
key=item
pos=idx
}
})
if(key){
temp.push(key)
keys.splice(pos,1)
Q[key]--
if(Q[key]<1){
delete Q[key]
}
}else{
break
}
}
q+=tmp.join('').padEnd(n+1,'-')
}
//边界的处理,最后不要出现冷却时间
q=q.replace(/-+$/g,'')
return q.length
}
排序的复杂度:

排序链表:

快速排序:

链表实现
//声明链表的节点
class Node{
constructor(value){
this.val=value
this.next=undefined
}
}
//声明链表的数据结构
class NodeList{
constructor(arr){
//声明链表的头部节点
let head=new Node(arr.shift())
let next
arr.forEach(item=>{
next.next=new Node(item)
next=next.next
})
return head
}
}
//交换两个节点的值
let swap=(p,q)=>{
let val=p.val
p.val=q.val
q.val=val
}
//寻找基准元素的节点
let partion=(begin,end)=>{
let val=begin.val
let p=begin
let q=begin.next
while(q!==end){
if(q.val<val){
p=p.next
swap(p,q)
}
q=q.next
}
//让基准元素跑到中间去
swap(p,begin)
return p
}
export default function sort(begin,end){
if(begin!==end){
let part=partion(begin,end) //找基准元素
sort(begin,end)
sort(part.next,end)
}
}
循环链表:



浙公网安备 33010602011771号