西电电院数据结构超级的恶心,作为一名电院正在学习数据结构的同学,我准备写一下这个帮助一下同学们,顺便记录一下我学习的历程。
设单链表中存放有n个字符,试编写算法,判断该字符串是否有中心对称的关系,例如xyzzyx是中心对称的字符串。(提示:将单链表中的一半字符先依次进栈,然后依次出栈与单链表中的另一半字符进行比较。)
这题比较简单就是判断字符串长度,一半以内入栈,然后出栈跟后边的元素一次比较即可。
判断字符串是否中心对.h
int symmetry(linklist*head,stack* s){
int n;
int a;
linklist* temp = head;
temp=temp->next;
int i = 0;
int flag = 0;
n = length(head);
if(n%2==0){
n=n/2;
for(i=0;i<n;i++){
push(s,temp->data);
temp=temp->next;
}
for(i=0;i<n;i++){
a = pop(s);
if(temp->data!=a){
flag = 1;
break;
}
temp=temp->next;
}
}
else{
n=n/2;
for(i=0;i<n;i++){
push(s,temp->data);
temp=temp->next;
}
temp=temp->next;
for(i=0;i<n;i++){
if(temp->data!=pop(s)){
flag = 1;
break;
}
temp=temp->next;
}
}
if(flag) return 0;
else return 1;
}
typedef char datatype; typedef struct node { datatype data; struct node *next; }linklist; const int maxsize=40; typedef struct { datatype elements[maxsize]; int top; }stack;
单链表顺序栈结构类型定义.H
建立单链表.h
void creat(linklist *&head,datatype*str)
{ datatype *p=str;
linklist *s,*r;
head=new linklist;
r=head;
while(*p!='\0')
{
s=new linklist;
s->data=*p;
r->next=s;
r=s;
p++;
}
r->next=NULL;
}
判字符串是否中心对称主程序文件.cpp
//判字符串中心对称的主程序文件.cpp
#include<iostream.h>
#include"单链表顺序栈结构类型定义.h"
#include"置栈空.h"
#include"求单链表长度.h"
#include"输出单链表.h"
#include"建立单链表.h"
#include"顺序栈入栈.h"
#include"顺序栈出栈.h"
#include"判字符串是否中心对称.h"
void main()
{
linklist *head;stack *s;
datatype str[80];
cin>>str;
creat(head,str);
printlink(head);
setnull(s);
if(symmetry(head,s)) cout<<"字符串\""<<str<<"\"中心对称\n";
else cout<<"字符串\""<<str<<"\"不是中心对称\n";
}
求单链表长度.H
int length(linklist*head)
{ linklist *p=head->next;
int n=0;
while(p!=NULL){ n++; p=p->next; }
return n;
}
输出单链表.h
void printlink(linklist*head)
{ linklist *p=head->next;
while(p!=NULL)
{ cout<<p->data;
p=p->next;
}
cout<<endl;
}
顺序栈出栈.H
datatype pop(stack*s)
{
datatype temp;
s->top--;
temp=s->elements[s->top+1];
return temp;
}
顺序栈入栈.h
void push(stack*s,datatype e)
{
s->top++;
s->elements[s->top]=e;
}
置栈空.H
void setnull(stack *&s)
{
s=new stack;
s->top=-1;
}