//同一字符串,存入链表和栈,通过比较出栈元素和链表来判断是否中心对称
#include<stdio.h>
#include<malloc.h>
#include<string.h>
//定义单链表结构类型
typedef char datatype;//datatype == char
typedef struct node //结点结构体,内有char类型data,结点指针*next
{
datatype data;
struct node *next;
}linklist; //linklist类型结点
//定义顺序栈结构类型
const int maxsize=40; //栈最大40
typedef struct
{
datatype elements[maxsize];
int top;
}stack;//栈内元素,栈顶
//栈初始化,分配s内存空间,top置为-1
void setnull(stack *&s)
{
s=(stack*)malloc(sizeof(stack));
s->top=-1;
}
//求单链表长度,p指向第一个结点,p不为空则一直进行n++,p移位
int length(linklist *head)
{
linklist *p=head->next;
int n=0;
while(p!=NULL){
n++;
p=p->next;
}
return n;
}
//输出单链表,一次输出一个
void printlink(linklist*head)
{
linklist *p=head->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
//建立具有头结点单链表
void create(linklist *&head,datatype *str)
{
datatype *p;
p=str;
linklist *s, *r;
head=(linklist*)malloc(sizeof(linklist));
r=head;
while(*p!='\0'){
s=(linklist*)malloc(sizeof(linklist));
s->data=*p;
r->next=s;
r=s;
p++;
}
r->next=NULL;
}
//顺序栈入栈
void push(stack*s,datatype e)
{
s->top++;
s->elements[s->top]=e;
}
//顺序栈出栈
datatype pop(stack*s)
{
datatype temp;
s->top--;
temp=s->elements[s->top+1];
return temp;
}
//添加判字符串否中心对称算法
int symmetry(linklist *head,stack *s)
{
int i,a;
datatype e;
linklist *p=head->next;
a=length(head)/2;
if (length(head)%2==0){
for (i=1;i<=a;i++){
e=p->data;
push(s,e);
p=p->next;
}
}
else
{
for (i=1;i<=a;i++){
e=p->data;
push(s,e);
p=p->next;
}
if (i==a+1){
e=p->data;
push(s,e);
}
}
while (p){
if(p->data!=pop(s))
return 0;
else p=p->next;
}
return 1;
}
int main()
{
linklist *head;stack *s;
datatype str[80];
printf("输入字符串\n");
gets(str);
create(head,str);
printlink(head);
setnull(s);
if(symmetry(head,s))
printf("字符串\"%s\"中心对称\n",str);
else
printf("字符串\"%s\"不是中心对称\n",str);
}
判断中心对称
最新推荐文章于 2021-10-29 12:03:56 发布