// 双端队列structDoubleQueue{privatevar data =[Int]()privatevar n =0, pre =0, tra =0publicvar trail:Int?{returnisEmpty?nil: data[tra -1]}publicvar prev:Int?{returnisEmpty?nil: data[pre]}publicvar total:Int{return tra - pre
}publicvarisEmpty:Bool{return tra - pre ==0}init(num:Int){
n = num
pre =0
tra =0
data =[Int](repeating:Int.min,count: num)}
@discardableResult
publicmutatingfuncenqueue(val:Int)->Bool{if total == n {reBuild()}// 数组前方有空余空间, 需要做数据搬移if tra == n && pre >0{for i in pre..<tra {
data[i-pre]= data[i]}
tra -= pre
pre =0}
data[tra]= val
tra +=1returntrue}
@discardableResult
publicmutatingfuncenqueueFront(val:Int)->Bool{if total == n {reBuild()}
pre = pre >0? pre -1:0
data.insert(val, at: pre)returntrue}
@discardableResult
publicmutatingfuncdequeue()->Int?{if total ==0{returnnil}let val = data[pre]
pre +=1return val
}
@discardableResult
publicmutatingfuncdequeueBack()->Int?{if total ==0{returnnil}let val = data[tra -1]
tra -=1return val
}privatemutatingfuncreBuild(){letcount= n *2var newData =[Int](repeating:Int.min,count:count)let range = newData.startIndex..<newData.index(newData.startIndex, offsetBy: n)
newData.replaceSubrange(range, with: data)
data = newData
n = n *2}}classMaxQueue{privatevar data =[Int]()privatevar queue:DoubleQueue!publicvarisEmpty:Bool{return data.count==0}init(){
data =[Int]()
queue =DoubleQueue(num:10)}funcmax_value()->Int{ifisEmpty{return-1}return queue.prev!}funcpush_back(_ value:Int){while(!queue.isEmpty&& value > queue.trail!){
queue.dequeueBack()}
queue.enqueue(val: value)
data.append(value)}funcpop_front()->Int{ifisEmpty{return-1}let val = data.removeFirst()if val == queue.prev {
queue.dequeue()}return val
}}/**
* Your MaxQueue object will be instantiated and called as such:
* let obj = MaxQueue()
* let ret_1: Int = obj.max_value()
* obj.push_back(value)
* let ret_3: Int = obj.pop_front()
*/