@@ -951,6 +951,98 @@ print_queue(q); // prints: ["b", null]
951
951
All operations should be accomplished in
952
952
<LATEXINLINE >$\Theta(1)$</LATEXINLINE > steps.
953
953
<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 >
954
1046
</EXERCISE >
955
1047
<INDEX >queue<CLOSE /></INDEX >
956
1048
</SUBSECTION >
0 commit comments