fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. // 链表节点结构体
  6. typedef struct Node {
  7. int data;
  8. struct Node* next;
  9. } Node;
  10.  
  11. // 栈结构体
  12. typedef struct {
  13. Node* top;
  14. } Stack;
  15.  
  16. // 队列结构体
  17. typedef struct {
  18. Node* front;
  19. Node* rear;
  20. } Queue;
  21.  
  22. /*----------- 栈操作 -----------*/
  23. void initStack(Stack* stack) {
  24. stack->top = NULL;
  25. }
  26.  
  27. bool isStackEmpty(Stack* stack) {
  28. return stack->top == NULL;
  29. }
  30.  
  31. void push(Stack* stack, int data) {
  32. Node* newNode = (Node*)malloc(sizeof(Node));
  33. if (!newNode) {
  34. fprintf(stderr, "内存分配失败\n");
  35. exit(EXIT_FAILURE);
  36. }
  37. newNode->data = data;
  38. newNode->next = stack->top;
  39. stack->top = newNode;
  40. }
  41.  
  42. int pop(Stack* stack) {
  43. if (isStackEmpty(stack)) {
  44. fprintf(stderr, "栈下溢错误\n");
  45. exit(EXIT_FAILURE);
  46. }
  47. Node* temp = stack->top;
  48. int data = temp->data;
  49. stack->top = temp->next;
  50. free(temp);
  51. return data;
  52. }
  53.  
  54. /*----------- 队列操作 -----------*/
  55. void initQueue(Queue* queue) {
  56. queue->front = NULL;
  57. queue->rear = NULL;
  58. }
  59.  
  60. bool isQueueEmpty(Queue* queue) {
  61. return queue->front == NULL;
  62. }
  63.  
  64. void enqueue(Queue* queue, int data) {
  65. Node* newNode = (Node*)malloc(sizeof(Node));
  66. if (!newNode) {
  67. fprintf(stderr, "内存分配失败\n");
  68. exit(EXIT_FAILURE);
  69. }
  70. newNode->data = data;
  71. newNode->next = NULL;
  72.  
  73. if (isQueueEmpty(queue)) {
  74. queue->front = queue->rear = newNode;
  75. } else {
  76. queue->rear->next = newNode;
  77. queue->rear = newNode;
  78. }
  79. }
  80.  
  81. int dequeue(Queue* queue) {
  82. if (isQueueEmpty(queue)) {
  83. fprintf(stderr, "队列下溢错误\n");
  84. exit(EXIT_FAILURE);
  85. }
  86. Node* temp = queue->front;
  87. int data = temp->data;
  88. queue->front = temp->next;
  89.  
  90. if (queue->front == NULL) {
  91. queue->rear = NULL; // 关键修正
  92. }
  93.  
  94. free(temp);
  95. return data;
  96. }
  97.  
  98. /*----------- 内存释放 -----------*/
  99. void freeStack(Stack* stack) {
  100. while (!isStackEmpty(stack)) {
  101. pop(stack);
  102. }
  103. }
  104.  
  105. void freeQueue(Queue* queue) {
  106. while (!isQueueEmpty(queue)) {
  107. dequeue(queue);
  108. }
  109. }
  110.  
  111. int main() {
  112. // 正确初始化示例
  113. Stack s;
  114. initStack(&s); // 必须初始化!
  115.  
  116. push(&s, 1);
  117. push(&s, 2);
  118. push(&s, 3);
  119.  
  120. printf("出栈元素:%d\n", pop(&s));
  121. printf("出栈元素:%d\n", pop(&s));
  122. printf("出栈元素:%d\n", pop(&s));
  123.  
  124. Queue q;
  125. initQueue(&q); // 必须初始化!
  126.  
  127. enqueue(&q, 1);
  128. enqueue(&q, 2);
  129. enqueue(&q, 3);
  130.  
  131. printf("出队元素:%d\n", dequeue(&q));
  132. printf("出队元素:%d\n", dequeue(&q));
  133. printf("出队元素:%d\n", dequeue(&q));
  134.  
  135. freeStack(&s);
  136. freeQueue(&q);
  137.  
  138. return 0;
  139. }
Success #stdin #stdout 0s 5320KB
stdin
1
2
10
42
11
stdout
出栈元素:3
出栈元素:2
出栈元素:1
出队元素:1
出队元素:2
出队元素:3