代码如下(头文件就不放出来了)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Palindrome1.h"
/*初始化带头结点的链式栈*/
void StackInitiate(SingleLinkedNode **head)
{
if((*head=(SingleLinkedNode *)malloc(sizeof(SingleLinkedNode)))==NULL)
exit(1);
(*head)->next=NULL;
}
/*入栈*/
int StackPush(SingleLinkedNode *head,ElemType x)
{
SingleLinkedNode *p;
if((p=(SingleLinkedNode *)malloc(sizeof(SingleLinkedNode)))==NULL)
{
printf("内存空间不足无法插入!\n");
return 0;
}
p->data=x;
p->next=head->next;//将p插入到头结点后面
head->next=p;//新结点成为新的栈顶
return 1;
}
/*出栈,后进先出*/
int StackPop(SingleLinkedNode *head,ElemType *d)
{
SingleLinkedNode *p=head->next;
if(p==NULL)
{
//printf("堆栈已空出错!");
return 0;
}
head->next=p->next;//删除原栈顶结点
*d=p->data;//原栈顶结点元素赋为d
free(p);
return 1;
}
/*初始化队列Q*/
void QueueInitiate(SequenceQueue *Q)
{
Q->front=0;//定义初始队头指针为0
Q->count=0;//初始计数器为0
}
/*入队列,在队列Q的队尾插入数据元素x*/
int QueueAppend(SequenceQueue *Q,ElemType x)
{
if(Q->count>=MaxQueueSize)
{
//printf("队列已满无法插入!\n");
return 0;
}
else
{
Q->queue[(Q->front+Q->count)%MaxQueueSize]=x;//通过MaxQueueSize防止假溢出且实现循环
Q->count++;
return 1;
}
}
/*出队列,把队列Q的队头元素删除并由参数d带回*/
int QueueDelete(SequenceQueue *Q,ElemType *d)
{
if(Q->count==0)
{
printf("循环队列已空,无数据元素出队列!\n");
return 0;
}
else
{
*d=Q->queue[Q->front];
Q->front=(Q->front+1)%MaxQueueSize;
Q->count--;
return 1;
}
}
。。。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Palindrome1.h"
int main()
{
SingleLinkedNode *s;
SequenceQueue d;
StackInitiate(&s);//初始化栈
QueueInitiate(&d);//给队列初始化
char c[N];
scanf("%s",c);//将输入的字符串交到数组
int i;
for(i=0;c[i];i++)//将数组中的每个字符取出并把每个字符进队列和进栈
{
if(c[i]>='a'&&c[i]<='z')
{
StackPush(s,c[i]);//进栈
QueueAppend(&d,c[i]);//进队列
}
}
char a;
char f=NULL;
while(StackPop(s,&a)&&QueueDelete(&d,&f))//实现了出队列的顺序和出栈的顺序是否一样
{
if(a!=f)//判断出循环的原因 如果是因为每个字符都比较完出的循环并且最后一个字符也都一样那么就是回文
break;
}
if(a==f)
{
printf("是回文!");
}
else
{
printf("不是回文!");
}
printf("\n");
return 0;
}
我加了个逗号,它就判断不是回文了,可是我不是已经只是让字母入栈和队列了吗?