-
Notifications
You must be signed in to change notification settings - Fork 0
/
stacks.zig
33 lines (29 loc) · 925 Bytes
/
stacks.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const std = @import("std");
const eql = std.meta.eql;
const ArrayList = std.ArrayList;
const expect = std.testing.expect;
const test_allocator = std.testing.allocator;
test "stack" {
const string = "(()())";
var stack = ArrayList(usize).init(test_allocator);
defer stack.deinit();
const Pair = struct { open: usize, close: usize };
var pairs = ArrayList(Pair).init(test_allocator);
defer pairs.deinit();
for (string) |char, i| {
if (char == '(') try stack.append(i);
if (char == ')')
try pairs.append(.{
.open = stack.pop(),
.close = i,
});
}
for (pairs.items) |pair, i| {
try expect(eql(pair, switch (i) {
0 => Pair{ .open = 1, .close = 2 },
1 => Pair{ .open = 3, .close = 4 },
2 => Pair{ .open = 0, .close = 5 },
else => unreachable,
}));
}
}