#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct {
int *items;
size_t len;
size_t capacity;
} Stack;
Stack stack_new(void)
{
Stack stack = {
.items = NULL,
.len = 0,
.capacity = 0
};
return stack;
}
void stack_push(Stack *stack, int value)
{
if (stack->len == stack->capacity) {
size_t new_capacity = stack->capacity == 0
? 4
: stack->capacity * 2;
stack->items,
new_capacity * sizeof(int)
);
if (new_items == NULL) {
}
stack->items = new_items;
stack->capacity = new_capacity;
}
stack->items[stack->len] = value;
stack->len++;
}
bool stack_pop(Stack *stack, int *value)
{
if (stack->len == 0) {
return false;
}
stack->len--;
*value = stack->items[stack->len];
return true;
}
bool stack_peek(const Stack *stack, int *value)
{
if (stack->len == 0) {
return false;
}
*value = stack->items[stack->len - 1];
return true;
}
bool stack_is_empty(const Stack *stack)
{
return stack->len == 0;
}
size_t stack_len(const Stack *stack)
{
return stack->len;
}
void stack_free(Stack *stack)
{
stack->items = NULL;
stack->len = 0;
stack->capacity = 0;
}
int main(void)
{
Stack stack = stack_new();
stack_push(&stack, 10);
stack_push(&stack, 20);
stack_push(&stack, 30);
printf("len = %zu\n", stack_len
(&stack
));
int value;
if (stack_peek(&stack, &value)) {
}
if (stack_pop(&stack, &value)) {
}
if (stack_pop(&stack, &value)) {
}
printf("len = %zu\n", stack_len
(&stack
)); stack_is_empty(&stack) ? "true" : "false");
stack_free(&stack);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCAqaXRlbXM7CiAgICBzaXplX3QgbGVuOwogICAgc2l6ZV90IGNhcGFjaXR5Owp9IFN0YWNrOwoKU3RhY2sgc3RhY2tfbmV3KHZvaWQpCnsKICAgIFN0YWNrIHN0YWNrID0gewogICAgICAgIC5pdGVtcyA9IE5VTEwsCiAgICAgICAgLmxlbiA9IDAsCiAgICAgICAgLmNhcGFjaXR5ID0gMAogICAgfTsKCiAgICByZXR1cm4gc3RhY2s7Cn0KCnZvaWQgc3RhY2tfcHVzaChTdGFjayAqc3RhY2ssIGludCB2YWx1ZSkKewogICAgaWYgKHN0YWNrLT5sZW4gPT0gc3RhY2stPmNhcGFjaXR5KSB7CiAgICAgICAgc2l6ZV90IG5ld19jYXBhY2l0eSA9IHN0YWNrLT5jYXBhY2l0eSA9PSAwCiAgICAgICAgICAgID8gNAogICAgICAgICAgICA6IHN0YWNrLT5jYXBhY2l0eSAqIDI7CgogICAgICAgIGludCAqbmV3X2l0ZW1zID0gcmVhbGxvYygKICAgICAgICAgICAgc3RhY2stPml0ZW1zLAogICAgICAgICAgICBuZXdfY2FwYWNpdHkgKiBzaXplb2YoaW50KQogICAgICAgICk7CgogICAgICAgIGlmIChuZXdfaXRlbXMgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgICAgICAgfQoKICAgICAgICBzdGFjay0+aXRlbXMgPSBuZXdfaXRlbXM7CiAgICAgICAgc3RhY2stPmNhcGFjaXR5ID0gbmV3X2NhcGFjaXR5OwogICAgfQoKICAgIHN0YWNrLT5pdGVtc1tzdGFjay0+bGVuXSA9IHZhbHVlOwogICAgc3RhY2stPmxlbisrOwp9Cgpib29sIHN0YWNrX3BvcChTdGFjayAqc3RhY2ssIGludCAqdmFsdWUpCnsKICAgIGlmIChzdGFjay0+bGVuID09IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgc3RhY2stPmxlbi0tOwogICAgKnZhbHVlID0gc3RhY2stPml0ZW1zW3N0YWNrLT5sZW5dOwoKICAgIHJldHVybiB0cnVlOwp9Cgpib29sIHN0YWNrX3BlZWsoY29uc3QgU3RhY2sgKnN0YWNrLCBpbnQgKnZhbHVlKQp7CiAgICBpZiAoc3RhY2stPmxlbiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgICp2YWx1ZSA9IHN0YWNrLT5pdGVtc1tzdGFjay0+bGVuIC0gMV07CgogICAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgc3RhY2tfaXNfZW1wdHkoY29uc3QgU3RhY2sgKnN0YWNrKQp7CiAgICByZXR1cm4gc3RhY2stPmxlbiA9PSAwOwp9CgpzaXplX3Qgc3RhY2tfbGVuKGNvbnN0IFN0YWNrICpzdGFjaykKewogICAgcmV0dXJuIHN0YWNrLT5sZW47Cn0KCnZvaWQgc3RhY2tfZnJlZShTdGFjayAqc3RhY2spCnsKICAgIGZyZWUoc3RhY2stPml0ZW1zKTsKCiAgICBzdGFjay0+aXRlbXMgPSBOVUxMOwogICAgc3RhY2stPmxlbiA9IDA7CiAgICBzdGFjay0+Y2FwYWNpdHkgPSAwOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBTdGFjayBzdGFjayA9IHN0YWNrX25ldygpOwoKICAgIHN0YWNrX3B1c2goJnN0YWNrLCAxMCk7CiAgICBzdGFja19wdXNoKCZzdGFjaywgMjApOwogICAgc3RhY2tfcHVzaCgmc3RhY2ssIDMwKTsKCiAgICBwcmludGYoImxlbiA9ICV6dVxuIiwgc3RhY2tfbGVuKCZzdGFjaykpOwoKICAgIGludCB2YWx1ZTsKCiAgICBpZiAoc3RhY2tfcGVlaygmc3RhY2ssICZ2YWx1ZSkpIHsKICAgICAgICBwcmludGYoInBlZWsgPSAlZFxuIiwgdmFsdWUpOwogICAgfQoKICAgIGlmIChzdGFja19wb3AoJnN0YWNrLCAmdmFsdWUpKSB7CiAgICAgICAgcHJpbnRmKCJwb3AgPSAlZFxuIiwgdmFsdWUpOwogICAgfQoKICAgIGlmIChzdGFja19wb3AoJnN0YWNrLCAmdmFsdWUpKSB7CiAgICAgICAgcHJpbnRmKCJwb3AgPSAlZFxuIiwgdmFsdWUpOwogICAgfQoKICAgIHByaW50ZigibGVuID0gJXp1XG4iLCBzdGFja19sZW4oJnN0YWNrKSk7CiAgICBwcmludGYoImVtcHR5ID0gJXNcbiIsCiAgICAgICAgICAgc3RhY2tfaXNfZW1wdHkoJnN0YWNrKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoKICAgIHN0YWNrX2ZyZWUoJnN0YWNrKTsKCiAgICByZXR1cm4gMDsKfQ==