#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef char ElemType;
typedef struct Stack{
ElemType data[MaxSize];
int top;
}SqStack;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitStack(Stack &S)//初始化栈
{
S.top = -1;
}
bool IsEmpty(Stack S)//判断栈是否为空
{
if(S.top == -1)
return true;
else
return false;
}
bool IsOverflow(Stack S)//判断是否栈满
{
if(S.top == MaxSize-1)
return true;
else
return false;
}
bool Push(SqStack &S,ElemType x)//进栈
{
if(!IsOverflow(S)){
S.data[++S.top] = x;
return true;
}else
return false;
}
bool Pop(SqStack &S,ElemType &x)//出栈
{
if(!IsEmpty(S))
{
x = S.data[S.top--];
return true;
}else
return false;
}
int createTailInsert(LinkList &L)//尾插法建立单链表
{
LNode *s,*r;
int len=0;//记录链表长度
ElemType x;
L = (LinkList)malloc(sizeof(LNode));
r = L;
scanf("%c",&x);
while(x!='#')
{
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
len++;
scanf("%c",&x);
}
r->next = NULL;
return len;
}
bool judgeSymmetry(LinkList L,int len)//判断"串"是否对称,串长已知:n
{
LNode *p = L->next;
ElemType x;
int n = len/2;
int j = len%2;//判断串长的奇偶
SqStack S;
InitStack(S);
while(n)//将链表中的前一半元素依次放入栈中
{
Push(S,p->data);
p = p->next;
--n;
}
if(j==1)
p = p->next;
while(p)//比较栈中元素与剩下的链表元素值
{
Pop(S,x);
if(x == p->data)
p = p->next;
else
return false;
}
return true;
}
void printList(LinkList L)
{
LNode *p=L->next;
while(p)
{
printf("%c",p->data);
p = p->next;
}
printf("\n");
}
void main()
{
LinkList L;
int len;
bool flag = false;
len = createTailInsert(L);
printList(L);
flag = judgeSymmetry(L,len);
if(flag)
printf("对称\n");
else
printf("不对称\n");
}
时间复杂度:o(n)