两个栈实现一个队列
功能add、delete、length
逻辑机构和物理结构的对比:
- 队列是逻辑结构,抽象模型
- 简单的,可以用数组、链表实现
- 复杂的队列服务,需要单独设计
假设一个队列A、B、C ,A为对首C为队尾
入队列从队尾进入,出队列从队尾出去。
// 通过两个栈来实现一个队列
// pop() 方法用于删除数组的最后一个元素并返回删除的元素。
export class MyQueue{
// private当前方法在自己的函数里可以调用,外面无法调用
private stack1: number[]=[]
private stack2: number[]=[]
// add方法,n为number类型
// 入队
add(n:number){
this.stack1.push(n)
}
// 出队
// detele返回一个number或者null
delete():number|null{
let res
const stack1=this.stack1
const stack2=this.stack2
// 1.将stack1所有的元素移动到Stack2中
while(stack1.length){
const n=stack1.pop()
if(n!=null){
stack2.push(n)
}
}
// 2.stack2 pop
res=stack2.pop()
// 3.将Stack2所有元素还给stack1
while(stack2.length){
const n=stack2.pop()
if(n!=null){
stack1.push(n)
}
}
return res || null
}
// length前面添加一个get属性可以通过属性的方式调用
get length():number{
// length里面的值,因为stack2是用完之后再返回到stack1,所以返回stack1的长度
return this.stack1.length
}
}
//功能测试
const q=new MyQueue()
q.add(100)
q.add(200)
q.add(300)
console.log(q.length);
console.log(q.delete());
console.log(q.length);
时间复杂度:add O(1);delete O(n)
空间复杂度,整体是O(n),整体储存的就是队列的长度,没有变,所以就是O(n)