aboutsummaryrefslogtreecommitdiffstats
path: root/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'stack.c')
-rw-r--r--stack.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/stack.c b/stack.c
index 80b8ed2..617e621 100644
--- a/stack.c
+++ b/stack.c
@@ -1,6 +1,6 @@
#include "stack.h"
-stack* newstack() {
+stack* stack_new() {
stack* s = (stack*)malloc(sizeof(stack));
s->size = 0;
s->maxsize = 1024;
@@ -8,7 +8,7 @@ stack* newstack() {
return s;
}
-stackitem pop(stack* s) {
+stackitem stack_pop(stack* s) {
if (s->size > 0) {
s->size = s->size - 1;
stackitem si = s->start[s->size];
@@ -19,7 +19,7 @@ stackitem pop(stack* s) {
}
}
-stackitem peek(stack* s) {
+stackitem stack_peek(stack* s) {
if (s->size > 0) {
return s->start[s->size - 1];
} else {
@@ -28,7 +28,7 @@ stackitem peek(stack* s) {
}
}
-void push(stack *s, stackitem si) {
+void stack_push(stack *s, stackitem si) {
// fprintf(stderr, "pushing %d", si);
if (s->size >= s->maxsize) {
fprintf(stderr, "Error Stack Overflow");
@@ -38,3 +38,39 @@ void push(stack *s, stackitem si) {
s->size = s->size + 1;
}
}
+
+int stack_depth(stack *s) {
+ return s->size;
+}
+
+void stack_printall(stack *s) {
+ printf("<%d>", s->size);
+ for (int i = 0; i < s->size; i++) {
+ printf(" %d", s->start[i]);
+ }
+ printf("\n");
+}
+
+void stack_roll(stack *s) {
+ int posfromtop = stack_pop(s); // top is 0, bottom is s->size - 1
+ const int maxindex = s->size - 1;
+ int i = maxindex - posfromtop;
+ if (i >= 0) {
+ int newtop = s->start[i];
+ for (; i + 1 < s->size; i++) {
+ s->start[i] = s->start[i+1];
+ }
+ s->start[i] = newtop;
+ }
+}
+
+void stack_pick(stack *s) {
+ int posfromtop = stack_pop(s); // top is 0, bottom is s->size - 1
+ const int maxindex = s->size - 1;
+ if (s->size > posfromtop) {
+ stack_push(s, s->start[maxindex - posfromtop]);
+ } else {
+ // no item found
+ stack_push(s, 0);
+ }
+}