Skip to content

Commit dd110b1

Browse files
committed
fixes #834
1 parent 7b7e2a5 commit dd110b1

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

xml/chapter3/section3/subsection2.xml

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,98 @@ function make_queue() {
853853
All operations should be accomplished in
854854
<LATEXINLINE>$\Theta(1)$</LATEXINLINE> steps.
855855
<LABEL NAME="ex:deque"/>
856+
<SOLUTION>
857+
<SNIPPET>
858+
<JAVASCRIPT>
859+
// solution provided by GitHub user clean99
860+
function make_deque() {
861+
return pair(null, null);
862+
}
863+
864+
function front_ptr(deque) {
865+
return head(deque);
866+
}
867+
868+
function rear_ptr(deque) {
869+
return tail(deque);
870+
}
871+
872+
function set_front_ptr(deque, item) {
873+
set_head(deque, item);
874+
}
875+
876+
function set_rear_ptr(deque, item) {
877+
set_tail(deque, item);
878+
}
879+
880+
function is_empty_deque(deque) {
881+
return is_null(front_ptr(deque))
882+
? true
883+
: is_null(rear_ptr(deque))
884+
? true
885+
: false;
886+
}
887+
888+
function is_one_item_deque(deque) {
889+
return front_ptr(deque) === rear_ptr(deque);
890+
}
891+
892+
function front_insert_deque(deque, item) {
893+
// use another pair to store a forward pointer
894+
const new_pair = pair(pair(item, null), null);
895+
if (is_empty_deque(deque)) {
896+
set_front_ptr(deque, new_pair);
897+
set_rear_ptr(deque, new_pair);
898+
} else {
899+
set_tail(new_pair, front_ptr(deque));
900+
// set forward pointer to new_pair
901+
set_tail(head(front_ptr(deque)), new_pair);
902+
set_front_ptr(deque, new_pair);
903+
}
904+
}
905+
906+
function front_delete_deque(deque) {
907+
if (is_empty_deque(deque)) {
908+
error(deque, "front_delete_deque called with an empty deque");
909+
} else if(is_one_item_deque(deque)) {
910+
set_front_ptr(deque, null);
911+
set_rear_ptr(deque, null);
912+
return deque;
913+
} else {
914+
set_front_ptr(deque, tail(front_ptr(deque)));
915+
return deque;
916+
}
917+
}
918+
919+
function rear_insert_deque(deque, item) {
920+
if (is_empty_deque(deque)) {
921+
const new_pair = pair(pair(item, null), null);
922+
set_front_ptr(deque, new_pair);
923+
set_rear_ptr(deque, new_pair);
924+
} else {
925+
// set new_pair forward pointer to last item
926+
const new_pair = pair(pair(item, rear_ptr(deque)), null);
927+
set_tail(rear_ptr(deque), new_pair);
928+
set_rear_ptr(deque, new_pair);
929+
}
930+
}
931+
932+
function rear_delete_deque(deque) {
933+
if (is_empty_deque(deque)) {
934+
error(deque, "rear_delete_deque called with an empty deque");
935+
} else if(is_one_item_deque(deque)) {
936+
set_front_ptr(deque, null);
937+
set_rear_ptr(deque, null);
938+
return deque;
939+
} else {
940+
// update rear_ptr to last item's forward pointer
941+
set_rear_ptr(deque, tail(head(rear_ptr(deque))));
942+
return deque;
943+
}
944+
}
945+
</JAVASCRIPT>
946+
</SNIPPET>
947+
</SOLUTION>
856948
</EXERCISE>
857949
<INDEX>queue<CLOSE/></INDEX>
858950
</SUBSECTION>

0 commit comments

Comments
 (0)