利用一个顺序栈,判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。(有些类似上一篇博客所说的回文)
解题思路:
对于字符串str,先将其所有元素进栈。从头开始扫描str,同时出栈元素,将出栈元素与从头开始扫描的str元素相比较,若不同则返回false。当str扫描完毕后返回true。实际上,从头开始扫描是从左向右读,出栈元素是从右向左读,它们相同的话则是对称串。
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
#define MaxSize 60
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int top; //栈顶指针
}SqStack; //定义顺序栈类型
//初始化栈
void InitStack(SqStack *&s){
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
//销毁栈
void DestroyStack(SqStack *&s){
free(s);
}
//判空
bool StackEmpty(SqStack *s){
return(s->top==-1);
}
//进栈
bool Push(SqStack *&s,ElemType e){
if(s->top==MaxSize-1) //进栈判满
return false;
s->top++; //指针加一
s->data[s->top]=e;
return true;
}
//出栈
bool Pop(SqStack *&s,ElemType &e){
if(s->top==-1) //出栈判空
return false;
e=s->data[s->top]; //取栈顶元素
s->top--; //指针减一
return true;
}
//判断一个字符串是否是对称串
bool symmetry(string str){
ElemType e;
SqStack *st;
InitStack(st); //初始化栈
//元素进栈
for(int i=0;i<str.length();i++){
Push(st,str[i]);
}
//比较栈中元素和字符串
for(int i=0;i<str.length();i++){
Pop(st,e); //出栈,e存放的是当前栈顶元素
if(e!=str[i]){ //不同
DestroyStack(st); //销毁栈
return false;
}
}
DestroyStack(st);
return true;
}
int main(){
string str;
cout<<"str:";
cin>>str;
bool flag;
//判断它是不是对称串
flag=symmetry(str);
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}