回文是指正读反读均相同的字符序列,如‘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在冗余位后一个位置,其他判断都同上。
该题应该是比较简单的,如果不用栈的思想可以通过截取前面保存到一个新的数组,在和后面的字符进行比较,因为数据结构就是我们用来解决问题的工具,既然学了栈的知识,就要灵活的运用在代码里面。
以上就是全部内容, 有疑问可以在评论区留言哈。