/*
链栈判断字符串是否中心对称(回文)
举例:
xyx, xyyx--中心对称
xy, xyy--不中心对称
注:
1、链栈的头结点不设置元素
2、不输入#,用于判空
*/
#include <iostream>
#include <cstdlib>
using namespace std;
typedef char Elemtype;
const int MAXSIZE = 100;
typedef struct LinkNode{
Elemtype data;
struct LinkNode *next;
}*LinkStack;
void InitStack(LinkStack &s){
s = (LinkStack)malloc(sizeof(LinkNode));
if(s){ //初始化空间分配成功
s->next = NULL;
}
}
void Push(LinkStack &s, Elemtype e){
//设置新结点
LinkStack s1 = (LinkStack)malloc(sizeof(LinkNode));
s1->data = e;
//加到链栈中
s1->next = s->next;
s->next = s1;
}
bool StackEmpty(LinkStack s){
if(s->next==NULL)
return true;
return false;
}
void Pop(LinkStack &s, Elemtype &e){
if(StackEmpty(s)==true) {
cout <<"栈空" <<endl;
return;
}
LinkStack p;
p = s->next;
e = p->data;
s->next = p->next;
free(p);
}
bool Huiwen(LinkStack s, string str){
int i;
char c;
for(i=0; i<(str.length()/2); i++)
Push(s, str[i]);
if(str.length()%2) //奇数长度字符串跳过中间元素
i++;
for(; i<str.length(); i++){
//后半段比较
Pop(s, c);
if(c!=str[i])
return false;
}
//处理形如"asds"的情况
if(StackEmpty(s))
return true;
return false;
}
int main(){
LinkStack s;
string str;
InitStack(s);
getline(cin, str);
if(Huiwen(s, str))
cout << str << "是中心对称的。" << endl;
else
cout << str << "不是中心对称的。" << endl;
return 0;
}
程序小白,如果代码有任何问题,欢迎指出。