当前位置:   article > 正文

用顺序栈实现回文序列的判断(c语言)_用顺序栈进行回文判断的方法

用顺序栈进行回文判断的方法

我是采用了两个栈值得比较大小判断得(可能比较浪费空间但是代码我感觉简单一点)

首先是定义一个栈的结构元素,由于是字符串类型就直接定义一个char的数组就可以:

  1. typedef struct stack
  2. {
  3. char data[MAX_SIZE]; //储存字符串//
  4. int top; //记录栈顶//
  5. }SeqStack;

下来就是初始化,我这里是用的耿国华老师的方法就直接给一个top元素指向栈顶,传入的指针地址:

  1. void Initstack(SeqStack *S) //初始化栈,让top指向栈顶//
  2. {
  3. S->top=-1;
  4. }

下面就是创建顺序栈了,元素只要没满就一直可以入住:

  1. int Push(SeqStack *S,char x) //压栈,只要top小于MAX_SIZE-1就可以继续入栈//
  2. {
  3. if(S->top<=MAX_SIZE-1)
  4. {
  5. S->top++;
  6. S->data[S->top]=x;
  7. }else{
  8. return -1;;
  9. }
  10. }

下面是核心函数,操作实现回文序列的判断,我注释的比较清楚直接看就可以了:

  1. void Pop(SeqStack *S) //出栈操作,也是最主要的操作//
  2. {
  3. SeqStack *p;
  4. p=(SeqStack*)malloc(sizeof(SeqStack)); //建立一个新的空栈,由于是指针类型要分配动态地址//
  5. Initstack(p); //给新的栈进行初始化//
  6. int i=S->top/2; //i用来分割两个字符串,将第二个字符串赋给新的空栈//
  7. int j=i-1; //j用来记录除了@之外的其他字符数量大小//
  8. while(S->top!=i) //开始对空栈进行赋值,对原来的栈开始清空(清空一般大小)//
  9. {
  10. p->top++;
  11. p->data[p->top]=S->data[S->top];
  12. S->top--;
  13. }
  14. S->top=S->top-2; //让原来的栈直接指向数字,跨过了字符@//
  15. for(int k=0;k<i-1;k++) //循环次数由i-1决定,也就是出去@字符之后的其他需要比较的字符//
  16. {
  17. if(S->data[S->top]==p->data[p->top]) //由于栈的特点先进后出,所以新栈的存储顺序和去掉@字符之后的旧栈的存储顺序是一样的,所以这里直接比较//
  18. {
  19. j--; //j是定义需要比较字符的大小,只要两个栈的元素ASCLL相等j就减一,如果全部相等j为0,该字符串就是互为回文序列//
  20. }
  21. S->top--; //两个top指针向下值//
  22. p->top--;
  23. if(j==0) //判断//
  24. {
  25. printf("两个字符串互为回文序列!");
  26. }
  27. }
  28. if(j!=0)
  29. {
  30. printf("两个字符串不互为回文序列!");
  31. }
  32. free(p); //free掉分配的空间//
  33. }

下面附上整个代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MAX_SIZE 100
  4. typedef struct stack
  5. {
  6. char data[MAX_SIZE]; //储存字符串//
  7. int top; //记录栈顶//
  8. }SeqStack;
  9. void Initstack(SeqStack *S) //初始化栈,让top指向栈顶//
  10. {
  11. S->top=-1;
  12. }
  13. int Push(SeqStack *S,char x) //压栈,只要top小于MAX_SIZE-1就可以继续入栈//
  14. {
  15. if(S->top<=MAX_SIZE-1)
  16. {
  17. S->top++;
  18. S->data[S->top]=x;
  19. }else{
  20. return -1;;
  21. }
  22. }
  23. void Pop(SeqStack *S) //出栈操作,也是最主要的操作//
  24. {
  25. SeqStack *p;
  26. p=(SeqStack*)malloc(sizeof(SeqStack)); //建立一个新的空栈,由于是指针类型要分配动态地址//
  27. Initstack(p); //给新的栈进行初始化//
  28. int i=S->top/2; //i用来分割两个字符串,将第二个字符串赋给新的空栈//
  29. int j=i-1; //j用来记录除了@之外的其他字符数量大小//
  30. while(S->top!=i) //开始对空栈进行赋值,对原来的栈开始清空(清空一般大小)//
  31. {
  32. p->top++;
  33. p->data[p->top]=S->data[S->top];
  34. S->top--;
  35. }
  36. S->top=S->top-2; //让原来的栈直接指向数字,跨过了字符@//
  37. for(int k=0;k<i-1;k++) //循环次数由i-1决定,也就是出去@字符之后的其他需要比较的字符//
  38. {
  39. if(S->data[S->top]==p->data[p->top]) //由于栈的特点先进后出,所以新栈的存储顺序和去掉@字符之后的旧栈的存储顺序是一样的,所以这里直接比较//
  40. {
  41. j--; //j是定义需要比较字符的大小,只要两个栈的元素ASCLL相等j就减一,如果全部相等j为0,该字符串就是互为回文序列//
  42. }
  43. S->top--; //两个top指针向下值//
  44. p->top--;
  45. if(j==0) //判断//
  46. {
  47. printf("两个字符串互为回文序列!");
  48. }
  49. }
  50. if(j!=0)
  51. {
  52. printf("两个字符串不互为回文序列!");
  53. }
  54. free(p); //free掉分配的空间//
  55. }
  56. int main()
  57. {
  58. SeqStack S;
  59. char x;
  60. int m=0;
  61. Initstack(&S);
  62. printf("请输入第一串字符\n");
  63. while(m!=2) //因为只需要输入两个字符串的判断,判断条件为m!=2//
  64. {
  65. scanf("%c",&x);
  66. if(x=='@') //输入@后表明第一个字符串结束//
  67. {
  68. m++;
  69. if(m==1)
  70. {
  71. printf("请输入第二串字符:\n");
  72. }
  73. }
  74. Push(&S,x);
  75. }
  76. Pop(&S);
  77. return 0;
  78. }

下面加一个例子:

判断3+1与1+3是否为回文序列

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

闽ICP备14008679号