栈、队列、链表专题
双栈模拟队列
队列支持队尾入队,队头出队,队头出队时可以访问队头
两个栈a,b
当入队时把元素入栈a
当出队时检查b中元素
若b为空则把a依次出栈并且入栈b(出栈一个就入栈b一个)
若b非空则出栈b,出栈b前的栈顶元素即为队首元素
正确性:
出队时相当于把a栈顺序倒过来,使得先入栈的在栈顶,此时栈顶就是队头
当b栈非空时说明之前的入队的还没有出完
当b栈为空时对当前a栈进行操作,入b栈,此时进行一轮新的出队
这个过程不会漏解,且一个元素只是如a栈一次,出a栈一次,入b栈一次,出b栈一次,所以对一个元素入队或出队操作是\(O(1)\)的
设a栈容量\(m\),b栈容量\(n\)(\(m>n\))
则所能允许的最大队列长度(保持队列规则前提下)是\(2n+1\)
因为a栈连续入\(n+1\)个时连续出队可以把先入队\(n\)个压到b栈,再入a栈一个,然后依次出队,b栈空时a栈压到b栈一个,出栈,可以成功
当a栈想要连续入\(2n+1\)个时,前入的n个依次出栈压到b栈,然后再入\(n+1\)个,此时开始出队,先出b栈,出完后把a栈后入队的\(n\)个元素压到b栈,留下第\(n+1\)个入队的元素,然后先把a栈这个第\(n+1\)个元素出栈,再出b栈的元素,也正确。
而当a栈连续入\(2n+2\)时,先入的n个压到b栈,再入\(n+2\)个,此时开始出队
先把b栈出光,然后此时a栈剩下\(n+2\)个,但只能把后n个压到b栈,此时出现了问题,a栈中有第\(n+1\)和\(n+2\)个元素,正常出队应该按照\(n+1,n+2\)的顺序,但此时是\(n+2,n+1\)的顺序,所以不成立
所以最大\(2n+1\)
双队列模拟栈
栈是后进先出,队列是先进先出,所以对于出栈来说就相当于将队尾出队
这里用两个队列a,b其容量分别为\(m,n\)(\(m>n\))
支持入栈操作和出栈操作,可以查看栈顶(即队尾)
入栈时将元素入a队,出栈时将a队依次出队入b队,直到队列剩下一个元素为止,然后弹出这个元素,再把b队依次出队入a队
查看栈顶相当于访问队尾
正确性:
对于一个元素来说,无需入b队,直接出队,正确
对于其他元素,相当于用一种办法把队尾留下并出队,然后 把队尾前面的元素再队尾出队后再归队,显然不会漏解,但可能不是\(O(1)\)的,因为一个元素可能会在其它元素出栈时多次出a队,入a队,出b队,入b队,会造成重复。
所能模拟的最大栈长度为(保持栈的性质时连续入栈个数的最大值)\(n+1\)
为什么?
因为当n个元素连续入栈时显然可以
\(n+1\)个元素连续入栈,出栈时先把前n个元素入b队,然后出队第\(n+1\)个元素,再把这\(n\)个元素归a队,显然正确
\(n+2\)个元素连续入栈,出栈时只能把前\(n\)个元素出队入b队,然后只能先出队第\(n+1\)个元素,违背了栈的性质,错误
所以最大\(n+1\)
链表:
链表插入删除都是\(O(1)\)
数组插入删除是\(O(n)\)
链表随机访问是\(O(n)\)(指任意查找一个下标所对应的值)
数组随机访问是\(O(1)\)
单向链表
一个next指针,一个value值
插入元素
在p和p->next间插入一个元素node:
Node->next=p->next
p->next=node
只有node的前一个元素和node本身的后继受到了影响
O(1)删除元素
删除元素p:
p->value=p->next->value
p->next=p->next->next
Delete p->next
单向循环链表
有头链表:
head为空头
插入元素node,在p和p->next之间
链表头事先处理,head->next=head
然后
Node->next=p->next
p->next=node
删除元素还是:
p->value=p->next->value
p->next=p->next->next
Delete 原p->next
无头链表:
插入元素node,在p和p->next之间
当p为空时
链表为空
此时p=node
Node->next=node
其余同单向链表
删除元素还是:
p->value=p->next->value
p->next=p->next->next
Delete 原p->next
双向链表
插入元素
:
left指前驱,right指后继
在p和p->right之间插入node
只有这3个元素left和right会变
node->left=p
Node->right=p->right
p->right->left=node
p->right=node
删除元素:
删除p元素:
改变的left和right有p的前驱和后继
p->left->right=p->right
p->right->left=p->left
Delete p
双向循环链表
删除元素同双向链表
插入元素有头链表头提前处理
Head->right=head
Head->left=head
其余同双向链表
无头链表在p和p->right插入node
当p为空时链表为空
p=node
Node->left=node
Node->right-node
其余同双向链表
黄粱一梦,终是一空
本文来自博客园,作者:sakrain,转载请注明原文链接:https://www.cnblogs.com/sakrain/p/19526602

浙公网安备 33010602011771号