当前位置:   article > 正文

C语言数据结构中利用栈和队列实现回文的判断_c语言用栈和队列判断会文

c语言用栈和队列判断会文

数据结构中栈有着极为广大的运用,其操作特点是FILO先进后出。队列的特点是FIFO先进先出。判断回文,回文序列很好理解,正反来看它都一样。那我们可以巧妙的利用栈和队列特点来判断回文,存入进抽象结构中,如果输出结果匹配,则为回文。

例如:aabaa为回文序列。进栈顺序为aabaa,其出栈为aabaa。同理队列进队aabaa,出队为aabaa。可以发现,回文前半段在队列中先输出,后半段在栈先输出,则进行匹配,如果相同,则是回文。

这里栈和队列都采用链式结构:

 

  1. typedef char DataType;
  2. typedef struct node
  3. {
  4. DataType info;
  5. struct node *next;
  6. }queuedata;
  7. typedef struct queuerecord{
  8. queuedata *front, *rear ;
  9. }linkqueue;
  10. typedef struct node *pqueuedata;
  11. typedef struct queuerecord *plinkqueue;

  1. struct node1{
  2. DataType element;
  3. struct node1 *next;
  4. };
  5. typedef struct node1 *PtrToNode;
  6. typedef struct node1 * stack;

核心代码如下

  1. int palindrome(char src[])
  2. {
  3. plinkqueue p1=createqueue();
  4. stack p2=createStack();
  5. int i=0;
  6. int j=0;
  7. while(src[i]!='\0')
  8. {
  9. pushqueue(src[i], p1);
  10. i++;
  11. }
  12. while(src[j]!='\0')
  13. {
  14. pushstack(src[j],p2);
  15. j++;
  16. }
  17. while(emptyequeue(p1)!=1)
  18. {
  19. DataType x1=popqueue(p1);
  20. DataType x2=popstack(p2);
  21. if(x1!=x2)
  22. return 0;
  23. }
  24. return 1;
  25. }

 完整代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef char DataType;
  4. typedef struct node
  5. {
  6. DataType info;
  7. struct node *next;
  8. }queuedata;
  9. typedef struct queuerecord{
  10. queuedata *front, *rear ;
  11. }linkqueue;
  12. typedef struct node *pqueuedata;
  13. typedef struct queuerecord *plinkqueue;
  14. plinkqueue createqueue( )
  15. {
  16. plinkqueue p=(plinkqueue)malloc(sizeof(linkqueue));
  17. p->front=NULL;
  18. p->rear=NULL;
  19. }
  20. int emptyequeue(plinkqueue q)
  21. {
  22. plinkqueue p;
  23. p=q;
  24. if(p->front==NULL)
  25. return 1;
  26. else
  27. return 0;
  28. }
  29. void pushqueue(DataType x, plinkqueue q)
  30. {
  31. pqueuedata p=(pqueuedata)malloc(sizeof(struct node));
  32. if(q->front==NULL&&q->rear==NULL)
  33. {
  34. q->front=p;
  35. q->rear=p;
  36. }
  37. p->info=x;
  38. p->next=NULL;
  39. q->rear->next=p;
  40. q->rear=q->rear->next;
  41. }
  42. DataType popqueue(plinkqueue q)
  43. {
  44. pqueuedata p=q->front;
  45. DataType temp=q->front->info;
  46. q->front=q->front->next;
  47. free(p);
  48. return temp;
  49. }
  50. struct node1{
  51. DataType element;
  52. struct node1 *next;
  53. };
  54. typedef struct node1 *PtrToNode;
  55. typedef struct node1 * stack;
  56. int emptystack(stack s)
  57. {
  58. if(s->element==0&&s->next==NULL)
  59. return 1;
  60. else
  61. return 0;
  62. }
  63. stack createStack(void)
  64. {
  65. stack top=(stack)malloc(sizeof(struct node1));
  66. top->element=0;
  67. top->next=NULL;
  68. return top;
  69. }
  70. void pushstack(DataType x,stack s)
  71. {
  72. stack temp=(struct node1 *)malloc(sizeof(struct node1));
  73. temp->element=x;
  74. temp->next=s->next;
  75. s->next=temp;
  76. }
  77. DataType popstack(stack s)
  78. {
  79. if(emptystack(s))
  80. return -1;
  81. else
  82. {
  83. stack node=s->next;
  84. int tmp;
  85. tmp=node->element;
  86. s->next=node->next;
  87. free(node);
  88. return tmp;
  89. }
  90. }
  91. int palindrome(char src[])
  92. {
  93. plinkqueue p1=createqueue();
  94. stack p2=createStack();
  95. int i=0;
  96. int j=0;
  97. while(src[i]!='\0')
  98. {
  99. pushqueue(src[i], p1);
  100. i++;
  101. }
  102. while(src[j]!='\0')
  103. {
  104. pushstack(src[j],p2);
  105. j++;
  106. }
  107. while(emptyequeue(p1)!=1)
  108. {
  109. DataType x1=popqueue(p1);
  110. DataType x2=popstack(p2);
  111. if(x1!=x2)
  112. return 0;
  113. }
  114. return 1;
  115. }
  116. int main(void)
  117. {
  118. char a[100]={'0'};
  119. scanf("%s",a);
  120. int res=palindrome(a);
  121. if(res==1)
  122. printf("该序列是回文序列");
  123. else
  124. printf("该序列不是回文序列");
  125. return 0;
  126. }

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

闽ICP备14008679号