• 2022-07-26
    通常称正读和反读都相同的字符序列为“回文”,例如,“abcdeedcba”、“abcdcba”是回文。若字符序列存储在一个单链表中,编写算法判断此字符序列是否为回文。(提示:将一半字符先依次进栈)
  • //算法思想://1.将字符串按照用户输入的顺序分别入栈和队列//2.分别从队列和栈中取出首个字符//3.比较取出的字符,若相等,继续分别从队列和栈中取首个字符;否则跳出循环,并设置标志flag=0;//4.若队列和栈中的字符取完,则结束,设置标志flag=1;//5.flag=1,表示字符从前往后和从后往前的序列完全匹配,该字符串属于回文//6.flag=0,表示字符从前往后和从后往前的序列不完全匹配,该字符串不属于回文#include#include#definem100typedefstruct{charstack[m];inttop;}stackstru;//定义栈typedefstruct{charqueue[m];intfront;intrear;}queuestru;//定义队列voidmain(){//函数声明intstinit(stackstru*s);//初始化顺序栈intstempty(stackstru*s);//判断栈是否为空intstpush(stackstru*s,charx);//入栈charstpop(stackstru*s);//出栈intquinit(queuestru*q);//初始化循环队列intquempty(queuestru*q);//判断队列是否为空intenqueue(queuestru*q,chare);//入队chardequeue(queuestru*q);//出队//charc;intflag=0;stackstru*s=(stackstru*)malloc(sizeof(stackstru));//为顺序栈申请空间queuestru*q=(queuestru*)malloc(sizeof(queuestru));//为队列申请空间stinit(s);//初始化栈quinit(q);//初始化队列printf("Inputastring:n");//输入字符串,输入@标示输入结束.while((c=getchar())!='@')//将输入的字符串入栈和队列{putchar(c);//输出输入的字符stpush(s,c);//字符进栈enqueue(q,c);//字符进队列}printf("n");printf("Endinput!n");//提示信息while(stempty(s))//栈中还有元素{if(stpop(s)==dequeue(q))//出栈的字符与出队列的字符匹配{flag=1;//将标志设置为1continue;//继续从栈和队列中区字符}else//字符不匹配{flag=0;break;//跳出循环,将标志设置为0}}if(flag==1)printf("Thisstringispalindrome!n");//标志位为1,完全匹配,是回文elseprintf("Thisstringisn'tpalindrome!n");//标志位为0,不完全匹配,不是回文}intstinit(stackstru*s){s->top=0;return1;}//初始化栈intstempty(stackstru*s){if(s->top==0)//栈顶为空{return0;}else{return1;}}//判断栈是否空intstpush(stackstru*s,charx){if(s->top==m)//栈满{printf("Thestackisoverflow!n");//输出提示信息return0;}else//栈未满{s->top=s->top+1;//栈顶后移s->stack[s->top]=x;//字符入栈return1;}}//入栈操作charstpop(stackstru*s){chary;if(s->top==0)//栈为空{printf("Thestackisempty!n");//输出提示信息return'';//返回空格}else//栈不为空{y=s->stack[s->top];//取出栈顶元素s->top=s->top-1;//栈顶指示移动returny;}}//出栈操作intquinit(queuestru*q){q->front=0;q->rear=0;return1;}//初始化为一个空的循环队列intquempty(queuestru*q){if(q->front==q->rear)//队头和队尾相等{return0;}else{return1;}}//判断队列是否为空intenqueue(queuestru*q,chare){if((q->rear+1)%m==q->front)//队列已满{printf("Thequeueisoverflow!n");//提示信息return0;}else{q->queue[q->rear]=e;//入队q->rear=(q->rear+1)%m;//移动队尾指针return1;}}//入队操作chardequeue(queuestru*q){charf;if(q->front==q->rear)//队列为空{printf("Thequeueisempty!n");//提示信息return0;}else{f=q->queue[q->front];//取出队首元素q->front=(q->front+1)%m;//移动对头指针returnf;}}//出队操作

    内容

    • 0

      编程判断一个字符串是否是回文。回文是指一个字符序列以中间字符为基准两边字符完全相同,如字符序列“ACBDEDBCA”是回文。

    • 1

      假设正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’ 和‘ababab’则不是回文。假设一字符序列已存入计算机,请分析用线性表、堆栈和队列等方式正确输出其回文的可能性?

    • 2

      从键盘上输入字符判断是否是回文,回文就是一个字符从左向右和从右向左读是一样的,如输入abcdcba,是回文;1234554321也是回文(回文数),请编程判断

    • 3

      试写一个算法,判别读入的一个以‘@’为结束符的字符序列是否是“回文”

    • 4

      利用栈结构编写一个算法识别依次读入的一个以“@”为结束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中序列1 和序列2 中都不含字符“&”,且序列1是序列2的逆序列。例如,“a+b&b+a”是属该模式的字符序列,而“1+3&3-1”则不是。