当前位置:   article > 正文

数据结构中的栈与队列_在软件设计中,栈和队列是数据逻辑结构

在软件设计中,栈和队列是数据逻辑结构

在数据结构中,有两个知识体系特别重要,分别是栈和队列。两个定义方法很类似,区别在于栈是先入后出,队列是先入先出。

     栈:一种先入后出的操作,主要以顺序栈为基础,栈其实类似与小时候的玩具枪的弹夹,最先按进去的子弹,最后才会发射。

 

栈的顺序实现:

 

  1. #pragma once
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #define MAX_SIZE 100
  7. typedef int SDataType;
  8. typedef struct Stack {
  9. SDataType array[MAX_SIZE];
  10. int top;
  11. } Stack;
  12. // 初始化
  13. void StackInit(Stack *pStack){
  14. assert(pStack != NULL);
  15. pStack->top = 0;
  16. }
  17. // 压栈
  18. void StackPush(Stack *pStack, SDataType data){
  19. assert(pStack != NULL);
  20. assert(pStack->top < MAX_SIZE);
  21. pStack->array[pStack->top++] = data;
  22. }
  23. // 出栈
  24. void StackPop(Stack *pStack){
  25. assert(pStack != NULL);
  26. assert(pStack->top>0);
  27. pStack->top--;
  28. }
  29. // 返回栈顶元素
  30. SDataType StackTop(Stack *pStack){
  31. assert(pStack != NULL);
  32. assert(pStack->top>0);
  33. return pStack->array[pStack->top-1];
  34. }
  35. // 判断是否为空
  36. // 1 空
  37. // 0 不空
  38. int StackIsEmpty(Stack *pStack){
  39. assert(pStack != NULL);
  40. if (pStack->top > 0){
  41. return 0;
  42. }
  43. else return 1;
  44. }
  45. // 返回数据个数
  46. int StackSize(Stack *pStack)
  47. {
  48. assert(pStack != NULL);
  49. assert(pStack->top>0);
  50. return pStack->top;
  51. }
  52. void TestStack(){
  53. Stack stack;
  54. StackInit(&stack);
  55. StackPush(&stack, 1);
  56. StackPush(&stack, 2);
  57. StackPush(&stack, 3);
  58. StackPush(&stack, 4);
  59. int ret;
  60. ret = StackSize(&stack);
  61. printf("栈:");
  62. for (int i = ret-1; i >=0; i--){
  63. printf("%d", stack.array[i]);
  64. }
  65. printf("\n");
  66. }

这是栈的顺序存储,常用的比较多。

 

队列:队列是一种先入先出的结构,和我们日常生活中的排队特别相似,排在队头的人,第一个享受服务。

   队列中链式队列使用的较多,这次主要以链式队列为主。

  链式队列代码:

  1. #pragma once
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <stdlib.h>
  5. typedef int QDataType;
  6. typedef struct QNode {
  7. QDataType data;
  8. struct QNode *pNext;
  9. } QNode;
  10. typedef struct Queue {
  11. QNode *pFront;
  12. QNode *pRear;
  13. int size;
  14. } Queue;
  15. // 初始化
  16. void QueueInit(Queue *pQueue)
  17. {
  18. assert(pQueue!=NULL);
  19. pQueue->pFront = pQueue->pRear = NULL;
  20. pQueue->size = 0;
  21. }
  22. // 入队列
  23. void QueuePush(Queue *pQueue, QDataType data){
  24. assert(pQueue!= NULL);
  25. QNode *pNewNode = (QNode*)malloc(sizeof(QNode));
  26. pNewNode->data = data;
  27. pNewNode->pNext = NULL;
  28. pQueue->size++;
  29. //队尾指针为空,空队列。
  30. if (pQueue->pRear ==NULL){
  31. pQueue->pFront = pQueue->pRear = pNewNode;
  32. return;
  33. }
  34. pQueue->pRear->pNext = pNewNode;//此时队尾元素的下一个指向新元素
  35. pQueue->pRear = pNewNode;//将队尾重置
  36. }
  37. // 出队列
  38. void QueuePop(Queue *pQueue){
  39. assert(pQueue != NULL);
  40. pQueue->size--;
  41. QNode *OldFront = pQueue->pFront;
  42. pQueue->pFront = pQueue->pFront->pNext;
  43. free(OldFront);
  44. if (pQueue->pFront = NULL){
  45. pQueue->pRear = NULL;
  46. }
  47. }
  48. // 返回队首元素
  49. QDataType QueueFront(Queue *pQueue){
  50. assert(pQueue != NULL);
  51. return pQueue->pFront->data;
  52. }
  53. // 判断是否为空
  54. // 1 空
  55. // 0 不空
  56. int QueueIsEmpty(Queue *pQueue){
  57. assert(pQueue != NULL);
  58. return pQueue->size > 0 ? 1 : 0;
  59. }
  60. // 返回数据个数
  61. int QueueSize(Queue *pQueue){
  62. assert(pQueue != NULL);
  63. return pQueue->size;
  64. }
  65. void TestQueue(){
  66. Queue pQueue;
  67. QueueInit(&pQueue);
  68. QueuePush(&pQueue, 2);
  69. QueuePush(&pQueue, 4);
  70. QueuePush(&pQueue, 5);
  71. QueuePush(&pQueue, 6);
  72. printf("队列:");
  73. while (pQueue.pFront!=NULL){
  74. printf("%d", pQueue.pFront->data);
  75. pQueue.pFront = pQueue.pFront->pNext;
  76. }
  77. printf("\n");
  78. }

 

 

至此,栈与队列的代码就显示完毕,大多数的操作已经在代码中体现出来,博主就不赘言太多,因为代码就是博主最想表露的心声。

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

闽ICP备14008679号