//char型データを格納するためのスタックを構造体として定義し、スタックを実現するための3つの関数を定義せよって問題なんですけど、
//void init(Stack *stack);
//○stackを初期化する
//char push(char c, Stack *stack);
//○stackに c をpushする．返り値はpushが成功したかどうか
//char pop(Stack *stack);
//○stackからデータをpopする．返り値はpopした値．ただし，失敗したときは0を返す。

#include <stdio.h>
#include <stdlib.h>

typedef struct TagStackEntry {
  char data;
  struct TagStackEntry *next;
} StackEntry;

typedef struct {
  StackEntry *top;
} Stack;

void init(Stack *stack)
{
  stack->top = NULL;
}

char push(char c, Stack *stack)
{
  StackEntry *e;
  if (c == 0) return 0;
  e = malloc(sizeof(StackEntry));
  if (e == 0) return '\0';
  e->data = c;
  e->next = stack->top;
  stack->top = e;
  return c;
}

char pop(Stack *stack)
{
  char c;
  StackEntry *next;
  if (stack->top == NULL)
    return 0;  
  c = stack->top->data;
  next = stack->top->next;
  free(stack->top);
  stack->top = next;
  return c;
}

int main()
{
  // init
  Stack stack;
  init(&stack);
  // push
  push('A', &stack);
  push('B', &stack);
  push('C', &stack);
  // pop & show
  {
    char c;
    while ((c = pop(&stack)) != '\0')
      printf("%c\n", c);
  }
  return 0;
}
