Skip to content

Commit 4fd83c6

Browse files
queue and deque from chapter 5
1 parent 7e58bf7 commit 4fd83c6

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

chp5.erl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-module(chp5).
2+
3+
-export([]).
4+
5+
-compile(export_all).

my_deque.erl

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
-module(my_deque).
2+
3+
-export([empty/0, is_empty/1,
4+
cons/2, head/1, tail/1,
5+
snoc/2, last/1, init/1]).
6+
7+
-compile(export_all).
8+
9+
empty() -> {[], []}.
10+
11+
is_empty({[],[]}) -> true;
12+
is_empty(_) -> false.
13+
14+
%% insert to front of deque
15+
cons(X, {[],[]}) -> {[X], []};
16+
cons(X, {[],[Y]}) -> {[X], [Y]};
17+
cons(X, {[],_R}=Q) -> cons(X, checkf(Q));
18+
cons(X, {F, R}) -> checkf({[X|F], R}).
19+
20+
%% inspect head
21+
head({[], []}=Q) -> {undefined, Q};
22+
head({[], [X]}) -> {X, {[], []}};
23+
head({[], _R}=Q) -> head(checkf(Q));
24+
head({[X|F],R}) -> {X, {F, R}}.
25+
26+
%% remove head from deque
27+
tail({[], []}) -> undefined;
28+
tail({[], [_X]}) -> empty();
29+
tail({[],_R}=Q) -> tail(checkf(Q));
30+
tail({[_X|F], R}) -> checkf({F, R}).
31+
32+
%% insert to end of list
33+
snoc(X, {[],[]}) -> {[], [X]};
34+
snoc(X, {[Y],[]}) -> {[Y], [X]};
35+
snoc(X, {_F,[]}=Q) -> snoc(X, checkf(Q));
36+
snoc(X, {F, R}) -> checkf({F, [X|R]}).
37+
38+
%% inspect the last element
39+
last({[], []}=Q) -> {undefined, Q};
40+
last({[X], []}) -> {X, {[], []}};
41+
last({_F, []}=Q) -> last(checkf(Q));
42+
last({F,[X|R]}) -> {X, {F, R}}.
43+
44+
%% remove last element from deque
45+
init({[], []}) -> undefined;
46+
init({[_X], []}) -> empty();
47+
init({_F,[]}=Q) -> init(checkf(Q));
48+
init({F, [_X|R]}) -> checkf({F, R}).
49+
50+
checkf({[],[]}=Q) -> Q;
51+
checkf({[], R}) ->
52+
{F, R1} = lists:split(length(R) div 2, R),
53+
{lists:reverse(F), R1};
54+
checkf({[_X], []}=Q) -> Q; % don't need to move the first el over to the end list
55+
checkf({F, []}) ->
56+
{F1, R} = lists:split(length(F) div 2, F),
57+
{F1, lists:reverse(R)};
58+
checkf(Q) -> Q.

my_queue.erl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
-module(my_queue).
2+
3+
-export([empty/0, is_empty/1, snoc/2, head/1, tail/1]).
4+
5+
-compile(export_all).
6+
7+
empty() -> {[],[]}.
8+
9+
is_empty({[],_R}) -> true;
10+
is_empty(_) -> false.
11+
12+
head({[],[]}=Q) -> {undefined,Q};
13+
head({[],R}) ->
14+
F = lists:reverse(R),
15+
{hd(F), {tl(F), []}};
16+
head({[H|F],R}) ->
17+
{H, {F,R}}.
18+
19+
snoc({F, R}, X) -> checkf({F, [X | R]}).
20+
21+
tail({F, R}) -> checkf({tl(F), R}).
22+
23+
checkf({[], R}) ->
24+
{lists:reverse(R),[]};
25+
checkf(Q) -> Q.

0 commit comments

Comments
 (0)