【问题描述】试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如 “序列1&序列2” 模式的字符序列。其中序列1和序列2都不含字符 “&”,且序列2是序列1的逆序列。例如,“ a+b&b+a ”是属该模式的字符序列,而 “1+3&3-1”则不是。
【输入形式】
以@为结尾的一串字符
【输出形式】
若符合模式则输出字符串长度,否则输出no
【样例输入】
a+b&b+a@
【样例输出】
3
#本体采用链栈的方式进行
注:不是原创,经过修改得来及自己的一些感悟
有不全面的欢迎修改
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct linkstacknode{
char data;
struct linkstacknode * next;
} linkstacknode,*Linkstack;//设置结点
void initstack(Linkstack *s )//C语言中没有引用只有指针初始化链栈
{
*s=NULL;
}
//进栈
void pushstack(Linkstack *s,char e)
{
linkstacknode *p;
p=(linkstacknode *)malloc(sizeof(linkstacknode));
p->data=e;
p->next=(*s);
(*s)=p;
}
//出栈
int popstack(Linkstack *s,char *e)
{
if((*s)==NULL)
return 0;
linkstacknode *p;
p=*s;
*e=p->data;
*s=(*s)->next;
free(p);
return 1;
}
int main() {
Linkstack s;
char e,p;
int flag=0,length=0;
initstack(&s);
scanf(" %c",&e);
while(e!='&'&&flag==0)//将&号前面的字符进栈
{
pushstack(&s,e);
length++;//栈的长度增加
scanf(" %c",&e);
}
if(e=='&') flag=1;//当输入&后
if(flag==1)
{
scanf(" %c",&e);继续输入&后字符
while(e!='@'&&s!=NULL)
{
popstack(&s,&p);将进栈的元素依次出栈并进行比较
if(e!=p)
{
printf("no\n");
return 0;
}
else scanf(" %c",&e);
}
}
printf("%d\n",length);
return 0;
}