●问题:
°编写一个算法利用顺序栈判断一个字符串str是否是对称串
°对称串: 从左到右读 和 从右向左读的序列相同
●解法1:
°顺序表存储
°从两边"夹逼" , 直到得出结论
同时从字符串的两端开始遍历对比,直到遍历到不相同的字符,否则对称
●解法二:
°顺序栈存储
°湘江str所有元素进栈 , 出栈的将是逆序的字符串
°从头开始扫描 str , 并出栈元素 , 将两者进行比较
°实质: 从头开始扫描str 是从左向右读 , 出栈顺序是从右往左读 , 两者相等说明该串是对 称串.
理解栈的思维 , 进栈和出栈的顺序是相反的 , 所以出栈的顺序就是 str 的逆序 ,然后两者一一对比, 从而判断出是否是对称
用栈判断对称串算法
我们要判断一个字符串是否是对称的 ,所以我们需要那个字符串数组
字符串数组以 '\0' 结束
先传入字符串数组
bool symmetry(ElemType str[]) {
然后我们就开始利用栈,来逆置 字符串数组的元素了, 然后再对比元素
构建栈
先定义栈,然后初始化栈, 接着往栈中压入元素就可以了
//定义栈中元素类型 ElemType e; //定义栈 SqStack *st; //初始化栈 , 调用初始化栈的成员函数(上一个作品讲过),就是将栈置空 InitStack(st); //将字符串的所有元素进栈(字符串数组,最后一个元素标志结束,所以自动填'\0' 所以比较的时候忽略) for( int i = 0 ; str[i]!='\0' ; i++) { //逐个遍历将字符串数组里面的数据压入栈中(调用入栈成员方法) Push(st,str[i]); }
现在我们已经完成了字符串入栈, 下面出栈的元素的顺序 就和 字符串的顺序相反 , 一一对比 ,就可以得出是否为对称串
//正序遍历字符串数组的元素 for(int i = 0; str[i]!='\0'; i++) { //出栈逆序字符串的元素 Pop(st,e); //两者比较 , 如果不相等 ,则跳出返回false ,同时销毁工具栈 if(str[i]!=e) { DestroyStack(st); return false; } }
如果上述遍历通过 , 不返回false ,则是正序表 ,销毁工具栈,同时返回 true
DestroyStack(st); return true; }