利用一個順序棧,判斷一個字元串是否是對稱串。所謂對稱串是指從左向右讀和從右向左讀的序列相同。(有些類似上一篇部落格所說的回文)
解題思路:
對于字元串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;
}