当前位置:   article > 正文

数据结构---栈和队列_数据结构栈和队列

数据结构栈和队列

刘佳瑜*,王越 *, 黄扬* , 张钊*

(淮北师范大学计算机科学与技术学院,安徽 淮北)

*These authors contributed to the work equllly and should be regarded as co-first authors.

目录

栈的逻辑结构

栈的基本操作

顺序栈

共享栈

链栈

队列的逻辑结构和基本操作 

队列的顺序实现

队列的链式存储

双端队列

栈在递归中的应用


栈的逻辑结构


 栈的基本操作


顺序栈

代码实现:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 5
  4. typedef int ElemType;
  5. typedef struct
  6. { ElemType data[MaxSize];
  7. int top; //栈顶指针
  8. }SqStack;
  9. //栈的初始化
  10. void InitSqStack(SqStack &S)
  11. {
  12. S.top=-1;
  13. }
  14. //判栈空
  15. bool StackEmpty(SqStack S)
  16. {
  17. if(S.top==-1)
  18. return true;
  19. else
  20. return false;
  21. }
  22. //入栈的操作
  23. bool Push(SqStack &S,ElemType x)
  24. {
  25. if(S.top==MaxSize-1)
  26. return false;
  27. S.top++;
  28. S.data[S.top]=x;
  29. }
  30. //出栈的操作
  31. bool Pop(SqStack &S,ElemType &x)
  32. {
  33. if(S.top==-1)
  34. return false;
  35. x=S.data[S.top];
  36. S.top--;
  37. }
  38. //打印出栈所有的元素
  39. void print(SqStack &S)
  40. {
  41. int i=0;
  42. printf("此时栈中的所有元素:\n");
  43. for(i=0;i<=S.top;i++)
  44. printf("%d ",S.data[i]);
  45. printf("\n");
  46. }
  47. int main()
  48. {
  49. SqStack S;
  50. int x=0;
  51. InitSqStack(S);
  52. printf("入栈0,1,2,3,4:\n");
  53. Push(S,0);
  54. Push(S,1);
  55. Push(S,2);
  56. Push(S,3);
  57. Push(S,4);
  58. print(S);
  59. printf("执行一次出栈:\n");
  60. Pop(S,x);
  61. print(S);
  62. }


 共享栈

  1. #include<stdio.h>
  2. #define MaxSize 10
  3. typedef struct()
  4. {
  5. int data[MaxSize];
  6. int top0;
  7. int top1;
  8. }
  9. void InitStack()
  10. {
  11. S.top0=-1;
  12. S.top1=MaxSize;
  13. }

链栈

代码实现: 

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 5
  4. typedef int ElemType;
  5. typedef struct Node
  6. { ElemType data;
  7. struct Node *next;
  8. }StackNode,*LinkStack;
  9. //栈的初始化
  10. void InitSqStack(LinkStack &top)
  11. {
  12. top=NULL;
  13. }
  14. //栈判空
  15. int StackEmpty(LinkStack top)
  16. {
  17. if(top==NULL)
  18. return true;
  19. else
  20. return false;
  21. }
  22. //进栈操作
  23. void Push(LinkStack &top,ElemType x)
  24. {
  25. LinkStack s;
  26. s=(LinkStack)malloc(sizeof(StackNode));
  27. s->data=x;
  28. s->next=top;
  29. top=s;
  30. }
  31. //出栈操作
  32. int Pop(LinkStack &top,ElemType &x)
  33. {
  34. if(StackEmpty(top))
  35. return false;
  36. LinkStack p;
  37. p=(LinkStack)malloc(sizeof(StackNode));
  38. x=top->data;
  39. p=top;
  40. top=top->next;
  41. free(p);
  42. return true;
  43. }
  44. void print(LinkStack top)
  45. {
  46. LinkStack p;
  47. top=top;
  48. printf("链栈中的元素:\n");
  49. while(top!=NULL)
  50. {
  51. printf("%d ",top->data);
  52. top=top->next;
  53. }
  54. }
  55. int main()
  56. {
  57. LinkStack top;
  58. InitSqStack(top);
  59. int x=0;
  60. printf("链栈的相关操作:\n");
  61. printf("进栈0,1,2,3,4:\n");
  62. Push(top,0);
  63. Push(top,1);
  64. Push(top,2);
  65. Push(top,3);
  66. Push(top,4);
  67. print(top);
  68. printf("\n");
  69. printf("执行一次出栈:\n");
  70. Pop(top,x);
  71. print(top);
  72. }


队列的逻辑结构和基本操作 


队列的顺序实现

队列的定义和初始化

  1. #define MaxSize 10
  2. typedef struct
  3. {
  4. int data[MaxSize];
  5. int front,rear;
  6. }SqQueue;
  7. void InitSqQueue(SqQueue &S)
  8. {
  9. int i;
  10. S.front=S.rear=0;
  11. }
  12. int main()
  13. {
  14. SqQueue S;
  15. InitSqQueue(S);
  16. return 0;
  17. }

  队列的入队和出队

  1. bool EnQueue(SqQueue &S,int e)
  2. {
  3. if((Q.rear+1)%MaxSize==Q.front)
  4. return false;
  5. Q.data[Q.rear]=e;
  6. Q.rear=(Q.rear+1)%MaxSize;
  7. }
  1. bool DeQueue(SqQueue &S,int &e)
  2. {
  3. if(Q.rear+1==Q.front)
  4. return false;
  5. e=Q.data[Q.front];
  6. Q.front=(Q.front+1)%MaxSize;
  7. }

求队列的长度

  1. int Length(SqQueue &S)
  2. {
  3. int length;
  4. length=(Q.rear+MaxSize-Q.front)%MaxSize;
  5. return length;
  6. }

 全部代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 6
  4. typedef int ElemType;
  5. typedef struct
  6. { ElemType data[MaxSize];
  7. int front,rear;
  8. }SqQueue;
  9. //初始化
  10. void InitSqQueue(SqQueue &Q)
  11. {
  12. Q.front=Q.rear=0;
  13. }
  14. //判空操作
  15. bool isEmpty(SqQueue Q)
  16. {
  17. if(Q.front==Q.rear)
  18. return true;
  19. else
  20. return false;
  21. }
  22. //判满操作
  23. bool isFull(SqQueue Q)
  24. {
  25. if((Q.rear+1)%MaxSize==Q.front)
  26. return true;
  27. else
  28. return false;
  29. }
  30. //入队操作
  31. int EnQueue(SqQueue &Q,ElemType x)
  32. {
  33. if(isFull(Q))
  34. return false;
  35. Q.data[Q.rear]=x;
  36. Q.rear=(Q.rear+1)%MaxSize;
  37. }
  38. //出队操作
  39. int DeQueue(SqQueue &Q,ElemType &x)
  40. {
  41. if(isEmpty(Q))
  42. return false;
  43. x=Q.data[Q.front];
  44. Q.front=(Q.front+1)%MaxSize;
  45. }
  46. //打印元素
  47. void print(SqQueue Q,int l)
  48. {
  49. int i;
  50. printf("此时队中的所有元素:\n");
  51. for(i=Q.front;i<Q.rear;i++)
  52. printf("%d ",Q.data[i]);
  53. printf("\n");
  54. }
  55. //计算元素的个数
  56. int QueueLength(SqQueue Q)
  57. {
  58. return ((Q.rear+MaxSize-Q.front)%MaxSize);
  59. }
  60. int main()
  61. {
  62. SqQueue Q;
  63. InitSqQueue(Q);
  64. int x=0,l1;
  65. printf("入队0,1,2,3,4:\n");
  66. EnQueue(Q,0);
  67. EnQueue(Q,1);
  68. EnQueue(Q,2);
  69. EnQueue(Q,3);
  70. EnQueue(Q,4);
  71. l1=QueueLength(Q);
  72. print(Q,l1);
  73. printf("执行一次出队:\n");
  74. DeQueue(Q,x);
  75. l1=QueueLength(Q);
  76. print(Q,l1);
  77. return 0;
  78. }

 队列的链式存储

初始化 

       Q是一个结构体类型(LinkQueue),里面有两个元素,一个是front指针,一个是rear指针,这两个指针均指向,一个结构体类型(LinkNode)。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 10
  4. typedef struct LinkNode
  5. {
  6. int data;
  7. struct LinkNode *next;
  8. }LinkNode;
  9. typedef struct LinkQueue
  10. {
  11. LinkNode *rear,*front;
  12. }LinkQueue;
  13. void InitQueue(LinkQueue &Q)
  14. {
  15. Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));
  16. Q.front->next=NULL;
  17. }
  18. int main()
  19. {
  20. LinkQueue Q;
  21. InitQueue(Q);
  22. return 0;
  23. }

入队

  1. void EnQueue(LinkQueue &Q,int x)
  2. {
  3. LinkNode *s;
  4. s=(LinkNode *)malloc(sizeof(LinkNode));
  5. s->data=x;
  6. s->next=NULL;
  7. Q.rear->next=s;
  8. Q.rear=s;
  9. }

出队

  1. void DeQueue(LinkQueue &Q,int &x)
  2. {
  3. LinkNOde *p=Q.front->next;
  4. x=p->data;
  5. Q.front->next=p->next;
  6. free(p);
  7. }

双端队列

双端队列可以分成两种一种是插入受限的双端队列,一种是删除受限的双端队列。


栈在递归中的应用

n=4,时,return Fib(3)+Fib(2), 执行到Fib(3)跳转函数执行。

n=3,时,return Fib(2)+Fib(1), 执行到Fib(2)跳转函数执行。

n=2,时,return Fib(1)+Fib(0), 执行到Fib(1)跳转函数执行。

n=1,时,return 1。

跳转到return Fib(1)【返回值1的位置】+Fib(0),执行到Fib(0)跳转函数执行。

n=0,时,return 0。

跳转到n=2,时,return Fib(1)【返回值1的位置】+Fib(0)【返回值2的位置】=1。

跳转到n=3,时,return Fib(2)【返回值2的位置】+Fib(1),执行到Fib(1)跳转函数执行。

Institutional Review Board Statement: Not applicable.

Informed Consent Statement: Not applicable.

Data Availability Statement: Not applicable.

Author Contributions:All authors participated in the assisting performance study and approved the paper.

Conflicts of Interest: The authors declare no conflict of interest.

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

闽ICP备14008679号