typedef struct StackNode
{
char date;
struct StackNode* next;
}*LinkStack,StackNode;
//初始化链栈
void InitStack(LinkStack* S)
{
*S=NULL;
}
//压栈
void PushStack(LinkStack* S,char e)
{
LinkStack p;
p=(LinkStack)malloc(sizeof(StackNode));
p->date=e;
p->next=*S;
*S=p;
}
//出栈
void PopStack(LinkStack* S,int* elem)
{
LinkStack p;
*elem=(*S)->date;
p=(*S);
*S=(*S)->next;
free(p);
}
//判断回文,存储字符串的一半,利用链栈的特性判断字符串是否是回文
int Is_cric(LinkStack* S,char arr[],int str)
{
int i=0;
int j=0;
int c;
//存储字符串的一半
for(i=0;i<str/2;i++)
{
PushStack(S,arr[i]);
}
//把每个字符压出来判断是否与后一半字符相等
while((*S)!=NULL)
{
int t=arr[j+str/2];
PopStack(S,&c);
if(t!=c)
{
printf("不是回文\n");
return 0;
}
j++;
}
printf("是回文\n");
return 1;
}
int main()
{
LinkStack S;
int str=0;
char arr[100];
printf("请输入字符串;>");
scanf("%s",arr);
str=strlen(arr);
InitStack(&S);
Is_cric(&S,arr,str);
return 0;
}
typedef struct node
{
int date;
struct node* next;
}QNode,*LinkQueue;
//声明一个尾指针
LinkQueue rear;
//初始化循环链表
void InitQueue(LinkQueue* q)
{
//给头节点分配空间
*q=(LinkQueue)malloc(sizeof(QNode));
rear=*q;
(*q)->next=NULL;
}
//判空函数
int Is_empty(LinkQueue* q)
{
if((*q)->next==(*q))
{
return 0;
}
else
return 1;
}
//入队
void In_Queue(LinkQueue* q,int e)
{
LinkQueue p;
//分配空间
p=(LinkQueue)malloc(sizeof(QNode));
//存储数据
p->date=e;
rear->next=p;
rear=p;
p->next=(*q);
}
//出队
void Out_Queue(LinkQueue* q,int* elem)
{
LinkQueue r;
if(!Is_empty)
{
printf("队列已空,无法出队\n");
}
r=(*q)->next;
*elem=r->date;
(*q)->next=r->next;
free(r);
}
int main()
{
int i=0;
int elem;
LinkQueue q;
InitQueue(&q);
for(i=0;i<10;i++)
{
In_Queue(&q,i);
}
for(i=0;i<10;i++)
{
Out_Queue(&q,&elem);
}
if(!Is_empty(&q))
{
printf("链表已空\n");
}
return 0;
}