fork(5) download
  1. #include <stdio.h>
  2.  
  3. // 構造体定義
  4. typedef struct _Node {
  5.  
  6. // 前のノードへのポインタ
  7. struct _Node *prev;
  8. // 値
  9. int value;
  10.  
  11. } Node;
  12.  
  13. // スタックポインタ(現在のノードを示すポインタ)
  14. Node *sp;
  15.  
  16. // 空かどうかを返す
  17. int empty() {
  18.  
  19. return sp == NULL;
  20.  
  21. }
  22.  
  23. // プッシュ
  24. void push(int value) {
  25.  
  26. Node *newNode;
  27. // 領域確保
  28. newNode = (Node *)malloc(sizeof(Node));
  29. // 値を代入
  30. newNode->value = value;
  31.  
  32. // 先頭以外ならば既に前にある要素と連結
  33. if (sp != NULL)
  34. newNode->prev = sp;
  35.  
  36. // スタックポインタを新しいノードに移動
  37. sp = newNode;
  38.  
  39. }
  40.  
  41. // ポップ
  42. int pop() {
  43.  
  44. // 空で取り出そうとしたならばエラー(アンダーフロー)
  45. if (empty()) {
  46. printf("エラー: スタックは空です\n");
  47. exit(1);
  48. }
  49.  
  50. // 返り値をセット
  51. int ret = sp->value;
  52. // 後にメモリ解放するノードをセット
  53. Node *fr = sp;
  54. // スタックポインタを前に移動
  55. sp = sp->prev;
  56. // メモリ解放
  57. free(fr);
  58. // 値を返す
  59. return ret;
  60.  
  61. }
  62.  
  63. // 表示
  64. void show() {
  65.  
  66. // 空ならばすぐに結果表示
  67. if (empty()){
  68. printf("現在、スタックは空です。\n");
  69. return;
  70. }
  71.  
  72. // この関数用のスタックポインタを用意
  73. Node *tmp = sp;
  74.  
  75. // 表示
  76. printf("\n 【現在のスタック】 \n\n");
  77. while (tmp != NULL) {
  78. printf(" ┃ %04d ┃\n", tmp->value);
  79. tmp = tmp->prev;
  80. }
  81. printf(" ┗━━━━┛\n");
  82.  
  83. }
  84.  
  85. // メイン
  86. int main(void) {
  87.  
  88. // 動作テスト
  89. push(1);
  90. push(2);
  91. push(pop());
  92. push(3);
  93. pop();
  94. show();
  95. return 0;
  96.  
  97. }
Success #stdin #stdout 0s 1920KB
stdin
Standard input is empty
stdout
 【現在のスタック】 

    ┃  0002  ┃
    ┃  0001  ┃
    ┗━━━━┛