通过栈实现回文判断

数据结构

题目

称正读与反读都相同的字符序列为“回文”序列。
试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如“序列1&序列2”模式的字符序列。其中序列1和序列2中都不含字符“&”,且序列2时序列1的逆序列。例如,“a+b&b+a”是属于该模式的字符序列,而“1+3&3-1”则不是。

程序源代码

 #include
 #include
 #include
 #define Maxsize 20
 typedef struct PalindromeQueue                             //定义顺序列表结构体
 {
	 char LinlistQ[Maxsize];
	 int front ;
	 int rear ;
 }PalindromeQueue;
 typedef struct PalindromeStack                             //定义顺序栈结构体
 {
	 char LinklistS[Maxsize];
	 int top;
 }PalindromeStack;
 void Init(PalindromeQueue *Q,PalindromeStack *S)            //初始化指针
 {	 	  
	 Q->front=Q->rear=0;
	 S->top=-1;
 }
void Judje(PalindromeQueue *Q,PalindromeStack *S)
{
	while (S->top != -1 )
	{
		if(Q->LinlistQ[Q->front] != S->LinklistS[S->top]){
		printf("! ! 该字符序列不是回文序列 !!\n");
		break;}
		(S->top)--;
		(Q->front)++;
	}
	if (S->top = -1 && Q->front == Q->rear)
	{	
	    printf("¥¥ 该序列式是回文序列 ¥¥\n");	
	}	
}
int main()
{
	int j=0;
	char List[Maxsize];
	PalindromeQueue  Q;
	PalindromeStack  S;	 
	printf("请输入一段需要判断是否是“回文序列”的字符序列并以'@'字符作为结束标识符\n");	 
	while(1)                                //输入的合法性检验
	{
	    scanf_s("%s",List,sizeof(List));    //sizeof时是一个操作符,可测量变量声明后所占内存数
	    if(List[strlen(List)-1] != '@'){    //strlen(char*)是一个函数,求的是字符串的实际长度,从第一个'\0'开始到'\0'结束,所测必须赋值
		printf("!!输入不合法,输入序列结束时未加'@',请重新输入!!\n");
		continue;}
		break;
	}	 
	Init(&Q,&S);                             //初始化队列和栈
	while(List[j] != '@')
	{
		Q.LinlistQ[j]=List[j];               //进入队列
		Q.rear++;                            //队尾后移
		S.LinklistS[j]=List[j];              //进栈
		S.top++;
		j++;		
	}	
	Judje(&Q,&S);                            //判断是否是回文序列
	return 0;
}
 

 

你可能感兴趣的:(c语言,数据结构)