栈和队列的应用之回文数判断

今天药忘吃喽~ 2023-10-09 21:36 63阅读 0赞

题目:

采用栈和队列的方法检测并输出一个单词是否为回文。

代码:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define SIZE 20
  4. using namespace std;
  5. //1.定义顺序栈
  6. typedef struct{
  7. char c[SIZE];//记录字符
  8. int top;//栈指针
  9. }Stack;
  10. //初始化栈
  11. void initStack(Stack &S){
  12. S.top=-1;//初始化指针
  13. }
  14. //入栈
  15. void push(Stack &S,char c){
  16. S.top++;//指针上移
  17. S.c[S.top]=c;//存储数据
  18. }
  19. //出栈
  20. void pop(Stack &S,char &c){
  21. c=S.c[S.top];
  22. S.top--;//指针下移
  23. }
  24. //2.定义循环队列
  25. typedef struct{
  26. char *base;
  27. int front;
  28. int rear;
  29. } Queue;
  30. //初始化队列
  31. void initQueue(Queue &Q){
  32. Q.base=(char *)malloc(SIZE*sizeof(char));//动态分配队列存储空间
  33. Q.front=Q.rear=0;//空队列
  34. }
  35. //入队列
  36. void inQueue(Queue &Q,char c){
  37. Q.base[Q.rear]=c;//存储数据
  38. Q.rear=(Q.rear+1)%SIZE;//队尾指针后移
  39. }
  40. //出队列
  41. void outQueue(Queue &Q,char &c){
  42. c=Q.base[Q.front];
  43. Q.front=(Q.front+1)%SIZE;//队头指针后移
  44. }
  45. //3.偶数个字符比较
  46. bool evenNumbers(Stack &S,Queue &Q,char &c){
  47. while(emptyStack(S)&&emptyQueue(Q)){
  48. if(S.c[S.top]!=Q.base[Q.front]){
  49. printf("不是回文!\n");
  50. return false;//返回false,结束循环
  51. }else{
  52. pop(S,c);//出栈
  53. outQueue(Q,c);//出队列
  54. }
  55. }
  56. return true;
  57. }
  58. //主函数
  59. int main(){
  60. Stack S;
  61. initStack(S);
  62. //定义、初始化循环队列
  63. Queue Q;
  64. initQueue(Q);
  65. char c;
  66. int count=0;
  67. printf("请输入单词,长度小于20: ");
  68. while((c=getchar())!='\n') { //循环读取字符并判断类型,以末尾换行符’\n’结束
  69. push(S,c);//入顺序栈
  70. inQueue(Q,c);//入队列
  71. count++;
  72. }
  73. if(count>2) {
  74. bool yes;
  75. if(count%2==0){
  76. yes=evenNumbers(S,Q,c);
  77. }else{
  78. yes=oddNumber(S,Q,c,count);
  79. }
  80. if(yes){printf("是回文单词!\n");}
  81. }else{
  82. printf("***单词字符个数少于3个无法判断是否为 回文***\n");
  83. }
  84. return 0;
  85. }

效果图:

cf5bfc1598344edba76eca2c3e053c29.png

思考:

中文回文如何判断呢?废话不多说,直接上代码:

代码:

  1. #include <iostream>
  2. #include <string.h>
  3. using namespace std;
  4. struct Stack{
  5. char data[100];
  6. int top;
  7. };
  8. int Test(Stack L,int lens,string a){
  9. int n;
  10. int x = lens/2;
  11. if(x%2 == 1){
  12. for(int i=0;i<lens/2-1;i++){
  13. L.data[L.top] = a[i];
  14. L.top++;
  15. }
  16. }else{
  17. for(int i=0;i<lens/2;i++){
  18. L.data[L.top] = a[i];
  19. L.top++;
  20. }
  21. }
  22. return 1;
  23. }
  24. int main(int argc, char **argv) {
  25. printf("请输入中文语句:\n");
  26. char str[100];
  27. gets(str);
  28. int lens = strlen(str);
  29. Stack L;
  30. L.top = 0;
  31. if(Test(L,lens,str)){
  32. printf("%s 是回文",str);
  33. }else{
  34. printf("%s 不是回文",str);
  35. }
  36. return 0;
  37. }

效果图:

21da8cfca38b4feb9ee16bd40f638c63.png

提高篇:

采用栈和队列方法编程实现统计一篇文档中的所有出现的回文单词。(这里小编建议采用文件的形式读入)

代码:

  1. #include <cstdlib>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <iostream>
  5. //队列
  6. typedef char QElemType;
  7. typedef struct {
  8. QElemType *base; //指向动态分配的数组中的元素
  9. int front;
  10. int rear;
  11. }SqQueue;
  12. //栈
  13. #define MaxSize 200
  14. typedef struct {
  15. char data[MaxSize];
  16. int top;
  17. }Stack;
  18. //队列
  19. void InitQueue(SqQueue &Q){
  20. //构造一个空队列Q
  21. Q.base = (QElemType *)malloc(sizeof(QElemType)*MaxSize);
  22. if(!Q.base) exit(1); //验证,Q不为空,返回1
  23. Q.front = Q.rear = 0;
  24. }
  25. void EnQueue(SqQueue &Q, QElemType e){
  26. //插入的元素e为Q的新的队尾元素
  27. if((Q.rear+1) % MaxSize == Q.front) exit(1);
  28. Q.base[Q.rear] = e;
  29. Q.rear = (Q.rear + 1) % MaxSize;
  30. }
  31. int DeQueue(SqQueue &Q, char &i) {
  32. //若队列不空,则删除Q的队头元素,并用i接收队头元素
  33. if(Q.front == Q.rear)
  34. exit(1);
  35. i = Q.base[Q.front];
  36. Q.front = (Q.front+1) % MaxSize;
  37. }
  38. //栈
  39. void InitStack(Stack &stack){
  40. stack.top = -1;
  41. }
  42. int push(Stack &S, char x) /*将x置入S栈新栈顶*/
  43. {
  44. if(S.top == MaxSize -1)
  45. return false;
  46. else{
  47. S.top++;
  48. S.data[S.top]=x;
  49. return true;
  50. }
  51. }
  52. int pop(Stack &S, char &x) /*将栈S的栈顶元素弹出,放到x中*/
  53. {
  54. if(S.top==-1)
  55. return false;
  56. else{
  57. x = S.data[S.top];
  58. S.top--;
  59. return true;
  60. }
  61. }
  62. int compare(char a, char b){
  63. if (a == b) return 0;
  64. else return 1;
  65. }

效果图:

470f22240c3c4c60870857d4470551aa.png

有问题也可以和小编一起交流!

发表评论

表情:
评论列表 (有 0 条评论,63人围观)

还没有评论,来说两句吧...

相关阅读

    相关 理解

    一.栈 1.1 概念 栈 :一种 特殊的线性表 ,其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。 栈中的数据元

    相关 应用停车问题

    题目: > 设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车

    相关 【算法】判断--使用

    “回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome

    相关 区别

    1.队列先进先出,栈先进后出。 对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性

    相关 实际应用

    1.将一个非负的十进制整数N转换成其他D进制数。 解决思路,连续取模%和整除/。D进制各数位的产生顺序是从低位到高位,而输出顺序却是从高位到低位,刚好相反,可以考虑使用栈进行