@@ -853,6 +853,98 @@ function make_queue() {
853
853
All operations should be accomplished in
854
854
<LATEXINLINE >$\Theta(1)$</LATEXINLINE > steps.
855
855
<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 >
856
948
</EXERCISE >
857
949
<INDEX >queue<CLOSE /></INDEX >
858
950
</SUBSECTION >
0 commit comments