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