当前位置:   article > 正文

数据结构-堆/栈 C语言实现_堆栈操作c语言实现

堆栈操作c语言实现

数据结构链接汇总:

【数据结构-堆/栈 C语言实现】

【数据结构-链表/顺序表 C语言】

【数据结构-队列 C语言】

【数据结构-二叉树遍历 C语言】

1.堆

堆排序

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. void heapify(int arr[], int i, int n)//建堆算法
  5. {
  6. int nchild;
  7. int tmp;
  8. for (; 2 * i + 1< n; i = nchild)
  9. {
  10. nchild = 2 * i + 1;
  11. if (nchild<n - 1 && arr[nchild + 1]>arr[nchild])
  12. nchild++;
  13. if (arr[i] < arr[nchild])
  14. {
  15. tmp = arr[i];
  16. arr[i] = arr[nchild];
  17. arr[nchild] = tmp;
  18. }
  19. }
  20. }
  21. void heapsort(int arr[], int n)
  22. {
  23. int i;
  24. for (i = (n - 1) / 2; i >= 0; i--)
  25. {
  26. heapify(arr, i, n);
  27. }
  28. for (i = n - 1; i > 0; i--)
  29. {
  30. //把第一个元素与当前最后一元素交换
  31. arr[i] = arr[0] ^ arr[i];
  32. arr[0] = arr[0] ^ arr[i];
  33. arr[i] = arr[0] ^ arr[i];
  34. //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
  35. heapify(arr, 0, i);
  36. }
  37. }

2.栈

顺序栈

  1. 栈的顺序存储
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #define SIZE 100
  6. typedef struct stack
  7. {
  8. int data[100];
  9. int top;
  10. }lstack;
  11. int is_empty(lstack* p)//判断栈是否为空
  12. {
  13. if (p->top == -1)
  14. {
  15. return 1;
  16. }
  17. return 0;
  18. }
  19. int get_top_lstack(lstack* p)//返回栈顶元素
  20. {
  21. if (!is_empty(p))
  22. {
  23. return p->data[p->top];
  24. }
  25. return false;
  26. }
  27. int pop(lstack* p)//弹出栈顶元素
  28. {
  29. if (!is_empty(p)) { return p->data[p->top--]; }
  30. return false;
  31. }
  32. lstack* push(lstack* p,int val)//元素入栈
  33. {
  34. if (p->top >= SIZE - 1)
  35. {
  36. return NULL;
  37. }
  38. p->top++;
  39. p->data[p->top] = val;
  40. return p;
  41. }
  42. void destory(lstack* p)//销毁顺序栈
  43. {
  44. if (!is_empty(p))
  45. {
  46. free(p);
  47. }
  48. }
  49. void print(lstack* p)//打印顺序栈
  50. {
  51. for (int j = 0; j <=p->top; j++)
  52. {
  53. printf("%d ", p->data[j]);
  54. }
  55. }
  56. int main()
  57. {
  58. lstack* t = (lstack*)malloc(sizeof(lstack));
  59. t->top = -1;
  60. for (int i = 0; i < 7; i++)
  61. {
  62. int val;
  63. scanf_s("%d", &val);
  64. push(t, val);
  65. }
  66. printf("顺序栈中的元素从栈顶到栈底依次是:\n");
  67. print(t);
  68. printf("\n弹出顺序栈顶元素:\n");
  69. int y = pop(t);
  70. printf("%d\n", y);
  71. return 0;
  72. }

链式栈

  1. 栈的链式存储
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. typedef struct node
  6. {
  7. int data;
  8. struct node* next;//下级节点
  9. }nodes;
  10. typedef struct head
  11. {
  12. int length;
  13. nodes* next;//栈顶元素指针
  14. }heads;
  15. heads* create()//创建头节点
  16. {
  17. heads* phead = (heads*)malloc(sizeof(heads));
  18. if (phead != NULL)
  19. {
  20. phead->next = NULL;
  21. phead->length = 0;
  22. }
  23. return phead;
  24. }
  25. int is_empty(heads* phead) //判断栈是否为空
  26. {
  27. if (phead->length == 0 || phead->next == NULL)
  28. {
  29. return 1;
  30. }
  31. return 0;
  32. }
  33. int get_size(heads* phead)//返回栈的大小
  34. {
  35. return phead->length;
  36. }
  37. heads* push(heads* phead, int val)//进栈操作
  38. {
  39. nodes* p = (nodes*)malloc(sizeof(nodes));
  40. if (p != NULL) { p->data = val; phead->length++; p->next = phead->next; phead->next = p; }
  41. return phead;
  42. }
  43. nodes* pop(heads* phead)//弹出栈顶元素
  44. {
  45. nodes* t = (nodes*)malloc(sizeof(nodes));
  46. t=phead->next;
  47. phead->next = phead->next->next;
  48. phead->length--;
  49. return t;
  50. }
  51. void destory(heads* phead)//销毁链栈
  52. {
  53. if (!is_empty(phead))
  54. {
  55. nodes* p = pop(phead);
  56. free(p);
  57. }
  58. }
  59. void print(heads* phead)//打印链栈
  60. {
  61. nodes* t = phead->next;
  62. for (int i = 0; i < phead->length; i++)
  63. {
  64. printf("%d ", t->data);
  65. t = t->next;
  66. }
  67. }
  68. int main()
  69. {
  70. heads* t = create();
  71. for (int i = 0; i < 7; i++)
  72. {
  73. int val;
  74. scanf_s("%d", &val);
  75. push(t, val);
  76. }
  77. printf("栈中的元素从栈顶到栈底依次是:\n");
  78. print(t);
  79. printf("\n弹出栈顶元素:\n");
  80. nodes* y = pop(t);
  81. printf("%d\n", y->data);
  82. return 0;
  83. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/90445
推荐阅读
相关标签
  

闽ICP备14008679号