Изменения

Перейти к: навигация, поиск

Персистентная очередь

456 байт добавлено, 13:15, 8 июня 2013
псевдокод операций
В качестве версии очереди мы будем использовать запись <tex>Q=<L, L', R, R', T, recopy, toCopy></tex>, содержащую пять версий стеков и две переменных.
Пусть персистентный стек возвращает вместе с обычным результатом стека новую версию, то есть операция <tex>S.pop</tex> возвращает <tex><S'Sn, x></tex>, а операция <tex>S.push</tex> возвращает <tex><S'Sn></tex>, аналогично свою новую версию возвращает и персистентная очередь.
Следующий псевдокод выполняет требуемые операции:
push(x)
'''if''' !recopy:
Ln = L.push(x) Q'= <Ln, L', R, R'if, T, recopy, toCopy> ''' Rcreturn'.size > 0: Rc'' Q'.pop() checkRecopy()
'''else''':
Ln' = L'.push(x) Q' = <L, Ln', R, R', T, recopy, toCopy> '''return''' Q'.checkNormal()
</code>
=== pop ===
pop()
'''if''' !recopy:
tmp <Rn, x> = R.pop() Rc.pop()Q' = <L, L', Rn, R', T, recopy, toCopy> '''if'return'' Rc'.size > 0: Rc<Q'.pop() checkRecopy() '''return''' tmp, x>
'''else''':
tmp <Rn', x> = RcR'.pop() toCopy Q' = <L, L', R, Rn', T, recopy, toCopy - 1 checkNormal()> '''return''' tmp<Q'.checkNormal(), x>
</code>
=== checkRecopy ===
<code>
checkRecopy()
recopy = '''if''' L.size > R.size: Q' = <L, L', R, R', T, true, R.size> '''return''' Q'.additionalOperations() '''ifelse''' recopy: '''return''' <L, L', R, R', T, false, toCopy = R.size additionalOperations()>
</code>
=== checkNormal ===
<code>
checkNormal()
Q' = Q.additionalOperations()
// Если мы не все перекопировали, то у нас не пуст стек T
recopy = return <Q'.L, Q'.L', Q'.R, Q'.R', Q'.T, Q'.T.size <tex> \ne </tex> 0, Q'.toCopy>
</code>
=== additionalOperations ===
toDo = 3
// Пытаемся перекопировать R в T
Rn = R Tn = T '''while''' toDo > 0 '''and''' RRn.size > 0: T<Rn, x> = Rn.pushpop(R) Tn = Tn.poppush()x)
toDo = toDo - 1
Ln = L // Пытаемся перекопировать L в R и Rc' '''while''' toDo > 0 '''and''' L1Ln.size > 0: <Ln, x > = LLn.pop() R.push(x) Rc'Rn = Rn.push(x)
toDo = toDo - 1
curCopy = toCopy // Пытаемся перекопировать T в R и Rc' с учетом toCopy '''while''' toDo > 0 '''and''' TTn.size > 0: <Tn, x > = TTn.pop() '''if''' toCopy curCopy > 0: RRn = Rn.push(x) Rc'.push(x) toCopy curCopy = toCopy curCopy - 1
toDo = toDo - 1
Ln' = L' // Если все скопировано, то меняем роли L1, L2 и Rc1, Rc2
'''if''' T.size == 0:
swap(LLn, LLn') swap(Rc '''return''' <Ln, RcLn'), Rn, R', Tn, recopy, curCopy>
</code>
120
правок

Навигация