数据结构算法题:回文数的实现

回文是指正读反读均相同的字符序列,如‘abba’和‘abdba’均是回文,但‘good’不是回文。试写一个算法判断给定的字符序列是否为回文

(提示:将一半的字符入栈)

思路:

从题目可知,题目要求我们使用栈的思想来实现回文数的判断,那么从栈的角度我们知道,栈是个先进后出的存储结构,基于这个思想,我们可以将一半的字符先依次压入栈中,再依次弹出栈顶元素和后面的的字符进行比较

假如这样一个字符串'abba',从前取一半出来即:'ab'  那么从栈顶取出的顺序则为'ba'这样我们就可以和后半段没有入栈的字符进行比较

先取出的是'b' 和 'b' 比较 再是'a' 和后面的'a' 进行比较 

代码

首先定义的是结构体部分

博主采用的是链式栈,所以一个是节点型的结构体 一个是存放节点的结构体

typedef struct stackNode{
	char data;
	stackNode * next;
}SNode,*PSNode;
typedef struct Stack{
	PSNode front;
}Stack,*PStack;

函数声明部分,ps:test()函数 是我用来测试的,可忽略

char  Pop_Stack(PStack S);
void En_Stack(PStack S,char val);
void Init_Stack(PStack S);
bool Huiwen(char str [] ,PStack S,int len);
void test(PStack S,int len);

初始化栈

void Init_Stack(PStack S)
{
	S->front = NULL;
}

入栈

void En_Stack(PStack S,char val)
{
	PSNode new_node = (PSNode)malloc(sizeof(SNode));
	new_node->data = val;
	new_node->next= S->front;
	S->front = new_node; //将新节点指向下一个节点,并且重新为头指针赋值
}

出栈

char Pop_Stack(PStack S) //出栈
{
	char val;
	if (S->front !=NULL) //栈不为空
	{
		PSNode del = (PSNode)malloc(sizeof(SNode)); //生成一个节点用于保存被删除的节点
		del = S->front;
		val = del->data;
		S->front = S->front->next;//将头指针往下移动
		free(del);
	}
	else
	{
		printf("栈为空");
	}
	return val;
}

回文数判断方法

bool Huiwen(char str [] ,PStack S,int len)
{
	if(len%2!=0||len%2==0)
	{
		int flag = len/2;
		int remainder = len%2; //求得余数
		for (int i = 0; i < flag; i++) //循环到一半的元素将元素放入栈中
		{
			En_Stack(S,str[i]); //入栈
		}
		char judge_ele;
		for (int i = flag+remainder; i

主函数

int _tmain(int argc, _TCHAR* argv[])
{
	Stack S;
	Init_Stack(&S);
	char str [] = {'x','a','c','a','x'};
	int len = sizeof(str)/sizeof(str[0]);
	if(Huiwen(str,&S,len))
	{
		printf("Bingo");
	}
	else
	{
		printf("error");
	}
	return 0;
}

这里补充下回文数的判断方法,我的思想是如果长度为偶数的话直接取一半入栈,后依次和后面的元素进行比较。

如果长度为奇数,那么肯定会有一个冗余位就是没人可以比较的,但是如果除去该字符前后都符合回文数,那么往前读+该冗余位,往后读+该冗余位,也同样会满足回文数的要求。所以在判断的模块直接让初始位置i在冗余位后一个位置,其他判断都同上。

结尾

该题应该是比较简单的,如果不用栈的思想可以通过截取前面保存到一个新的数组,在和后面的字符进行比较,因为数据结构就是我们用来解决问题的工具,既然学了栈的知识,就要灵活的运用在代码里面。

以上就是全部内容, 有疑问可以在评论区留言哈。

你可能感兴趣的:(数据结构算法题:回文数的实现)