当前位置:   article > 正文

[数据结构]C语言实现栈和队列_栈与队列c代码

栈与队列c代码

目录

一、栈的概念、结构

栈的实现

二、队列概念、结构

 队列的实现


栈的概念、结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈,出数据也在栈顶

 栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

stack.h头文件:

  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<assert.h>
  6. #include<stdbool.h>
  7. typedef int STDatatype;
  8. typedef struct Stack
  9. {
  10. STDatatype*a;
  11. int top;
  12. int capacity;
  13. }ST;
  14. //初始化栈
  15. void StackInit(ST*ps);
  16. //栈销毁
  17. void StackDestroy(ST*ps);
  18. //入栈
  19. void StackPush(ST*ps,STDatatype x);
  20. //出栈
  21. void StackPop(ST*ps);
  22. //获取栈顶元素
  23. STDatatype StackTop(ST*ps);
  24. //获取栈中有效个数
  25. int StackSize(ST*ps);
  26. //判断栈是否为空
  27. bool StackEmpty(ST*ps);

代码实现:

  1. #include"stack.h"
  2. //初始化栈
  3. void StackInit(ST*ps)
  4. {
  5. assert(ps);
  6. ps->a = NULL;
  7. ps->capacity = ps->top = 0;
  8. }
  9. //栈销毁
  10. void StackDestroy(ST*ps)
  11. {
  12. assert(ps);
  13. free(ps->a);
  14. ps->a = NULL;
  15. ps->capacity = ps->top = 0;
  16. }
  17. //入栈
  18. void StackPush(ST*ps, STDatatype x)
  19. {
  20. assert(ps);
  21. if (ps->capacity == ps->top)
  22. {
  23. int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
  24. STDatatype*new = realloc(ps->a,sizeof(STDatatype)*newcapacity);
  25. if (new == NULL)
  26. {
  27. printf("realloc fail");
  28. exit(-1);
  29. }
  30. ps->a = new;
  31. ps->capacity = newcapacity;
  32. }
  33. ps->a[ps->top] = x;
  34. ps->top++;
  35. }
  36. //出栈
  37. void StackPop(ST*ps)
  38. {
  39. assert(ps);
  40. assert(ps->top>0);
  41. ps->top--;
  42. }
  43. //获取栈顶元素
  44. STDatatype StackTop(ST*ps)
  45. {
  46. assert(ps);
  47. assert(ps->top>0);
  48. return ps->a[ps->top - 1];
  49. }
  50. //获取栈中有效数据个数
  51. int StackSize(ST*ps)
  52. {
  53. assert(ps);
  54. return ps->top ;
  55. }
  56. //判断栈是否为空
  57. bool StackEmpty(ST*ps)
  58. {
  59. //为空返ture 不为空返false
  60. assert(ps);
  61. return ps->top == 0;
  62. }

队列概念、结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 ,入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

 队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

Queue.h头文件:

  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<assert.h>
  6. #include<stdbool.h>
  7. typedef int QDataType;
  8. typedef struct QListNode
  9. {
  10. struct QListNode*next;
  11. QDataType data;
  12. }QListNode;
  13. typedef struct Queue
  14. {
  15. QListNode*head;
  16. QListNode*tail;
  17. }Queue;
  18. //初始化队列
  19. void QueueInit(Queue* q);
  20. // 队尾入队列
  21. void QueuePush(Queue* q, QDataType data);
  22. // 队头出队列
  23. void QueuePop(Queue* q);
  24. // 获取队列头部元素
  25. QDataType QueueFront(Queue* q);
  26. // 获取队列队尾元素
  27. QDataType QueueBack(Queue* q);
  28. // 获取队列中有效元素个数
  29. int QueueSize(Queue* q);
  30. // 检测队列是否为空,如果为空返回true,如果非空返回false
  31. bool QueueEmpty(Queue* q);
  32. // 销毁队列
  33. void QueueDestroy(Queue* q);

 Queue.c:

  1. #include"Queue.h"
  2. //初始化队列
  3. void QueueInit(Queue* q)
  4. {
  5. assert(q);
  6. q->head = NULL;
  7. q->tail = NULL;
  8. }
  9. // 队尾入队列
  10. void QueuePush(Queue* q, QDataType x)
  11. {
  12. assert(q);
  13. QListNode*newcode = (QListNode*)malloc(sizeof(QListNode));
  14. newcode->data = x;
  15. newcode->next = NULL;
  16. if (q->head == NULL)
  17. q->head = q->tail = newcode;
  18. else
  19. {
  20. q->tail->next = newcode;
  21. q->tail = newcode;
  22. }
  23. }
  24. // 队头出队列
  25. void QueuePop(Queue* q)
  26. {
  27. assert(q);
  28. assert(!QueueEmpty(q));
  29. QListNode*next = q->head->next;
  30. free(q->head);
  31. q->head = next;
  32. if (q->head == NULL)
  33. q->tail = NULL;
  34. }
  35. // 获取队列头部元素
  36. QDataType QueueFront(Queue* q)
  37. {
  38. assert(q);
  39. assert(!QueueEmpty(q));
  40. return q->head->data;
  41. }
  42. // 获取队列队尾元素
  43. QDataType QueueBack(Queue* q)
  44. {
  45. assert(q);
  46. assert(!QueueEmpty(q));
  47. return q->tail->data;
  48. }
  49. // 获取队列中有效元素个数
  50. int QueueSize(Queue* q)
  51. {
  52. assert(q);
  53. int tmp = 0;
  54. QListNode*cur = q->head;
  55. while (cur)
  56. {
  57. ++tmp;
  58. cur = cur->next;
  59. }
  60. return tmp;
  61. }
  62. // 检测队列是否为空,如果为空返回true,如果非空返回false
  63. bool QueueEmpty(Queue* q)
  64. {
  65. assert(q);
  66. return q->head == NULL;
  67. }
  68. // 销毁队列
  69. void QueueDestroy(Queue* q)
  70. {
  71. assert(q);
  72. QListNode*cur = q->head;
  73. while (cur != NULL)
  74. {
  75. QListNode*next = cur->next;
  76. free(cur);
  77. cur = next;
  78. }
  79. q->head = q->tail = NULL;
  80. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/621903
推荐阅读
相关标签
  

闽ICP备14008679号