算法导论
blinkbean
不知名CRUD选手。
展开
-
两个队列实现栈
用两个队列实现栈,并分析相关栈操作的运行时间。思路同:两个栈实现队列type DequeStack struct { pushDeque *Deque popDeque *Deque flag bool // true in push, false in pop}func (d *DequeStack) exchange(from, to *Deque) { to.Clean() for true { if v, ok := from.Pop(); ok { to.Push(v原创 2020-12-21 00:09:33 · 198 阅读 · 0 评论 -
两个栈实现队列
用两个栈实现队列,并分析相关队列操作的运行时间。单栈push和pop的运行时间都为O(1),所以需要考虑的就是两个栈之间切换所用时间。最坏情况:在push和pop交替操作时,需要将一个栈中的数据转移到另一个栈中,转移所用时间为O(n),n为当前栈中元素个数。最好情况:用flag记录上一次是push还是pop,如果和当前操作一致,则直接操作对应的栈,时间复杂度为O(1)。package mainconst maxSize = 10type StackDeque struct { push原创 2020-12-20 23:18:56 · 305 阅读 · 0 评论 -
单数组实现双端队列
栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4个时间均为O(1)的过程,分别实现在双端队列插入和删除元素的操作,该队列使用一个数组实现的。package main// 一个数组实现双端队列const maxSize = 10type Deque struct { leftHead int rightHead int size int // 记录现有元素数量 arr原创 2020-12-20 22:25:46 · 473 阅读 · 0 评论 -
如何在一个数组中实现两个栈?
如何在一个数组A[1…n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。要求push和pop操作的运行时间为O(1)。实现:两个栈分别从数组的两端开始,向中间push元素,直到两个指针相遇。package mainimport "fmt"const maxSize = 10const ( sLeft stackType = iota sRight)type stackType inttype Stack struct { arr [max原创 2020-12-19 23:07:34 · 859 阅读 · 1 评论