Plan

四月数据结构学习的相关点

 

 

 

 

利用栈的特性 来判断输入的是否是回文

/*SS
应用顺序栈实现回文(Palindromic Sequence)判断,具体如下:
    试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如"序列1&序列2"模式的字符序列。
	其中序列1和序列2中都不含字符"&",且序列2是序列1的逆序列。例如,"a+b&b+a"是属于该模式的字符序列,
	而"1+3&3-1"则不是。

*/
#include<stdio.h>
#include<stdlib.h>

#define ERROR 0
#define OK 1
#define MAX 100

//顺序栈的定义
typedef char DataType;//栈中的元素类型为char
typedef struct LNode
{
	DataType elem[MAX];
	int top;//栈顶位置
}SeqStack;

//基本操作
//栈的初始化
void initStack (SeqStack *S)
{
	S->top=-1;
}
//进栈
int push(SeqStack *S, DataType x)
{
	if(S->top==MAX-1)
	{	
		printf("full\n");
		return ERROR;
	}
	S->top++;
	S->elem[S->top]=x;
	return OK;
}
//出栈
int pop(SeqStack *S, DataType *x)
{
	if(S->top==-1)
	{
		printf("empty\n");
		return ERROR;
	}
	*x=S->elem[S->top];
	S->top--;
	return OK;
}
//取栈顶元素
int getTop(SeqStack *S, DataType *x)
{
	if(S->top==-1)
	{
		printf("empty\n");
		return ERROR;
	}
	*x=S->elem[S->top];
	return OK;
}


int Palindromic(char str[])
{
	SeqStack S;
	initStack (&S);
	
	int i;
	for(i=0; str[i]!='\0' && str[i]!='@' && str[i]!='&'; i++)//将&符号之前的序列1入栈
		push(&S, str[i]);
	if(str[i]=='\0' || str[i]=='@')//若没有&符号
	{
		printf("there is no &\n");
		return ERROR;
	}

	i++;//跳过&符号

	for( ; str[i]!='\0' && str[i]!='@'; i++)//对&符号之后的序列2,按照字符一个一个进行操作
	{
		DataType x;
		if(pop(&S, &x)==0)//将栈顶元素出栈,存储在x中,若栈为空,则说明序列2比序列1长,不是回文序列
		{
			printf("this is not a palindromic sequence.\n");
			return ERROR;
		}
		if(x!=str[i])//若序列1与序列2的字符不一样,则说明不是回文序列
		{
			printf("this is not a palindromic sequence.\n");
			return ERROR;
		}
	}

	if(S.top!=-1)//若栈非空,则说明序列1比序列2长,不是回文序列
	{
		printf("this is not a palindromic sequence.\n");
		return ERROR;
	}
	printf("yes");
	return OK;
}



void main()
{
	char str[MAX];
	gets_s(str);//读入字符序列
	Palindromic(str);//回文判断
}

  

 

posted @ 2020-04-30 22:49  silence777  阅读(385)  评论(0编辑  收藏  举报