Skip to content

Commit 05aad83

Browse files
authored
fixes #834 (#1021)
1 parent 3845699 commit 05aad83

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
@@ -951,6 +951,98 @@ print_queue(q); // prints: ["b", null]
951951
All operations should be accomplished in
952952
<LATEXINLINE>$\Theta(1)$</LATEXINLINE> steps.
953953
<LABEL NAME="ex:deque"/>
954+
<SOLUTION>
955+
<SNIPPET>
956+
<JAVASCRIPT>
957+
// solution provided by GitHub user clean99
958+
function make_deque() {
959+
return pair(null, null);
960+
}
961+
962+
function front_ptr(deque) {
963+
return head(deque);
964+
}
965+
966+
function rear_ptr(deque) {
967+
return tail(deque);
968+
}
969+
970+
function set_front_ptr(deque, item) {
971+
set_head(deque, item);
972+
}
973+
974+
function set_rear_ptr(deque, item) {
975+
set_tail(deque, item);
976+
}
977+
978+
function is_empty_deque(deque) {
979+
return is_null(front_ptr(deque))
980+
? true
981+
: is_null(rear_ptr(deque))
982+
? true
983+
: false;
984+
}
985+
986+
function is_one_item_deque(deque) {
987+
return front_ptr(deque) === rear_ptr(deque);
988+
}
989+
990+
function front_insert_deque(deque, item) {
991+
// use another pair to store a forward pointer
992+
const new_pair = pair(pair(item, null), null);
993+
if (is_empty_deque(deque)) {
994+
set_front_ptr(deque, new_pair);
995+
set_rear_ptr(deque, new_pair);
996+
} else {
997+
set_tail(new_pair, front_ptr(deque));
998+
// set forward pointer to new_pair
999+
set_tail(head(front_ptr(deque)), new_pair);
1000+
set_front_ptr(deque, new_pair);
1001+
}
1002+
}
1003+
1004+
function front_delete_deque(deque) {
1005+
if (is_empty_deque(deque)) {
1006+
error(deque, "front_delete_deque called with an empty deque");
1007+
} else if(is_one_item_deque(deque)) {
1008+
set_front_ptr(deque, null);
1009+
set_rear_ptr(deque, null);
1010+
return deque;
1011+
} else {
1012+
set_front_ptr(deque, tail(front_ptr(deque)));
1013+
return deque;
1014+
}
1015+
}
1016+
1017+
function rear_insert_deque(deque, item) {
1018+
if (is_empty_deque(deque)) {
1019+
const new_pair = pair(pair(item, null), null);
1020+
set_front_ptr(deque, new_pair);
1021+
set_rear_ptr(deque, new_pair);
1022+
} else {
1023+
// set new_pair forward pointer to last item
1024+
const new_pair = pair(pair(item, rear_ptr(deque)), null);
1025+
set_tail(rear_ptr(deque), new_pair);
1026+
set_rear_ptr(deque, new_pair);
1027+
}
1028+
}
1029+
1030+
function rear_delete_deque(deque) {
1031+
if (is_empty_deque(deque)) {
1032+
error(deque, "rear_delete_deque called with an empty deque");
1033+
} else if(is_one_item_deque(deque)) {
1034+
set_front_ptr(deque, null);
1035+
set_rear_ptr(deque, null);
1036+
return deque;
1037+
} else {
1038+
// update rear_ptr to last item's forward pointer
1039+
set_rear_ptr(deque, tail(head(rear_ptr(deque))));
1040+
return deque;
1041+
}
1042+
}
1043+
</JAVASCRIPT>
1044+
</SNIPPET>
1045+
</SOLUTION>
9541046
</EXERCISE>
9551047
<INDEX>queue<CLOSE/></INDEX>
9561048
</SUBSECTION>

0 commit comments

Comments
 (0)