该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/*--------用线性表存储字符串,结合堆栈判断回文(关键判断个数为奇或偶,奇跳过中间数据)---------*/
#include
#include
#define ok 1;
#define error 0;
typedef char elemtype;
typedef struct lnode{
lnode *next;
elemtype data;
} lnode,*linklist;
bool createlist(linklist &h,int n){
//尾差插法
linklist p,q;
h=new lnode;
h->next=NULL;
q=h;
cout<
if(n<0) return error;
for(int i=0;i
p=new lnode;
cin>>p->data;
p->next=q->next;
q->next=p;
q=q->next;
}
return ok;
}
bool printlist(linklist h){
linklist p;
p=h->next;
while(p!=NULL){
cout<data<
p=p->next;
}
return ok;
}
#define initsize 100
#define stackincrs 10
typedef struct{
elemtype *base;
elemtype *top;
int stacksize;
} stack;
bool initstack(stack &s){
s.base=new elemtype [initsize];
s.top=s.base;
s.stacksize=initsize;
return ok;
}
bool push(stack &s,elemtype e){
if(s.top-s.base>=s.stacksize){
s.base=(elemtype*)realloc(s.base,(s.stacksize+stackincrs)*sizeof(elemtype));
s.top=s.base+s.stacksize;
s.stacksize=s.stacksize+stackincrs;
}
*s.top++=e;
return ok;
}
bool pop(stack &s,elemtype &e){
if(s.top==s.base) return error;
--s.top;
e=*s.top;
return ok;
}
/************************回文判别***********/
bool jude(stack &s,linklist h,int n){
//结果:flag=1为回文,flag=0不为回文
linklist p=h->next;
for(int i=1;i<=n/2;i++){
push(s,p->data);
p=p->next;
}
if(n%2) p=p->next;
bool flag=1;
elemtype c;
while(p!=NULL&&flag){
pop(s,c);
if(c==p->data)
p=p->next;
else flag=0;
}
return flag;
}
void main(){
int n;
stack s;
linklist h;
initstack(s);
cout<
cin>>n;
createlist(h,n);
if (jude(s,h,n))
cout<
else
cout<
cout<
}