Skip to content

Commit 29438fb

Browse files
authored
Merge pull request #10 from ascii-dev/implement_vector_based_stack
implement vector based stack
2 parents 3ed1024 + 8e99db7 commit 29438fb

File tree

6 files changed

+100
-0
lines changed

6 files changed

+100
-0
lines changed

c/includes/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ exports_files(["greet.h"])
22
exports_files(["vector.h"])
33
exports_files(["slinkedlist.h"])
44
exports_files(["llstack.h"])
5+
exports_files(["arrstack.h"])

c/includes/arrstack.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef ARRSTACK_H
2+
#define ARRSTACK_H
3+
4+
#include <stdio.h>
5+
#include <stdlib.h>
6+
7+
typedef struct ArrStack ArrStack;
8+
9+
ArrStack* arrstack_new();
10+
void arrstack_push(ArrStack* stack, const void* item);
11+
void* arrstack_pop(ArrStack* stack);
12+
short arrstack_empty(ArrStack* stack);
13+
void arrstack_free(ArrStack* stack);
14+
15+
#endif

c/src/stack/BUILD.bazel

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,12 @@ cc_library(
88
deps = ["//c/src/linkedlist:slinkedlist"],
99
visibility = ["//visibility:public"],
1010
)
11+
12+
cc_library(
13+
name = "arrstack",
14+
srcs = ["arrstack.c"],
15+
hdrs = ["//c/includes:arrstack.h"],
16+
strip_include_prefix = "//c",
17+
deps = ["//c/src/vector:vector"],
18+
visibility = ["//visibility:public"],
19+
)

c/src/stack/arrstack.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "includes/arrstack.h"
2+
3+
#include <stdlib.h>
4+
5+
#include "includes/vector.h"
6+
7+
struct ArrStack {
8+
Vector* vector;
9+
};
10+
11+
ArrStack* arrstack_new() {
12+
ArrStack* stack = malloc(sizeof(ArrStack));
13+
if (stack == NULL) return NULL;
14+
15+
stack->vector = vector_new(10);
16+
if (stack->vector == NULL) {
17+
free(stack);
18+
return NULL;
19+
}
20+
return stack;
21+
}
22+
23+
void arrstack_push(ArrStack* stack, const void* item) { vector_push(stack->vector, item); }
24+
25+
void* arrstack_pop(ArrStack* stack) { return vector_pop(stack->vector); }
26+
27+
short arrstack_empty(ArrStack* stack) { return vector_empty(stack->vector); }
28+
29+
void arrstack_free(ArrStack* stack) {
30+
vector_free(stack->vector);
31+
free(stack);
32+
}

c/tests/BUILD.bazel

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,12 @@ cc_test(
3535
"@googletest//:gtest_main",
3636
],
3737
)
38+
39+
cc_test(
40+
name = "arrstack_test",
41+
srcs = ["arrstack_test.cc"],
42+
deps = [
43+
"//c/src/stack:arrstack",
44+
"@googletest//:gtest_main",
45+
],
46+
)

c/tests/arrstack_test.cc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "gtest/gtest.h"
2+
3+
extern "C" {
4+
#include "includes/arrstack.h"
5+
}
6+
7+
TEST(ArrStackTest, NewArrStack) {
8+
ArrStack* stack = arrstack_new();
9+
ASSERT_NE(stack, nullptr);
10+
ASSERT_EQ(arrstack_empty(stack), 1);
11+
arrstack_free(stack);
12+
}
13+
14+
TEST(ArrStackTest, PushAndPop) {
15+
ArrStack* stack = arrstack_new();
16+
ASSERT_NE(stack, nullptr);
17+
ASSERT_EQ(arrstack_empty(stack), 1);
18+
int item1 = 10;
19+
int item2 = 20;
20+
int item3 = 30;
21+
arrstack_push(stack, &item1);
22+
arrstack_push(stack, &item2);
23+
arrstack_push(stack, &item3);
24+
25+
ASSERT_EQ(arrstack_empty(stack), 0);
26+
ASSERT_EQ(arrstack_pop(stack), &item3);
27+
ASSERT_EQ(arrstack_empty(stack), 0);
28+
ASSERT_EQ(arrstack_pop(stack), &item2);
29+
ASSERT_EQ(arrstack_empty(stack), 0);
30+
ASSERT_EQ(arrstack_pop(stack), &item1);
31+
ASSERT_EQ(arrstack_empty(stack), 1);
32+
33+
arrstack_free(stack);
34+
}

0 commit comments

Comments
 (0)