栈和队列——实现回文函数

通过栈的先进后出特性和队列先进先出的特性可以同时进行存储,然后取出数据,最后比较两部分数据是否相等,如果相等,则可以认为此数字是回文数据而已。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef char DataType;
//链式堆栈结点类型定义
typedef struct snode{
	DataType data;
	struct snode *next;
}LSNode;
//只有队尾指针的链式循环队列类型定义 
typedef struct QNode{
	DataType data;
	struct QNode *next;
}LQNode,*LinkQueue; 
//带头结点的链式堆栈初始化
void InitStack(LSNode **head){
	if((*head=(LSNode*)malloc(sizeof(LSNode)))==NULL)//为头结点分配空间
	{
		printf("分配结点不成功");
		exit(-1);
	 } 
	 else{
	 	(*head)->next=NULL;//为头结点的指针域 
	 }
} 
//判断带头结点的链式堆栈是否为空。如果堆栈为空,返回1,否则返回0
int StackEmpty(LSNode *head){
	if(head->next==NULL){
		return 1;
	}else{
		return 0;
	}
} 
//链式堆栈进栈 。 进栈成功返回1,否则退出
int PushStack(LSNode *head,DataType e){
	LSNode *s;
	s=(LSNode*)malloc(sizeof(LSNode)); 
	if(!s){
		exit(-1);
	}
	s->data=e;
	s->next=head->next;
	head->next=s;
	return 1;
} 
//链式堆栈出栈,需要判断堆栈是否为空,出栈为空返回1,否则返回0
int PopStack(LSNode *head,DataType *e){
	LSNode *s=head->next;
	if(StackEmpty(head)){
		return 0;
	}else{
		head->next=s->next;
		*e=s->data;
		free(s);
		return 1; 
	}
} 
//将带头结点的链式循环队列初始化为空队列,需要把头结点的指针指向头结点
void InitQueue(LinkQueue *rear){
	*rear=(LQNode*)malloc(sizeof(LQNode));
	if(*rear==NULL){
	  exit(-1);
	}else{
		(*rear)->next=*rear;
	}
} 
//判断链式队列是否为空,队列为空返回为1,否则返回0
int QueueEmpty(LinkQueue rear){
	if(rear->next==rear){
		return 1;
	} else{
		return 0;
	}
}
//将元素e 插入到链式队列中,插入成功返回1
int EnQueue(LinkQueue *rear,DataType e){
	LQNode *s;
	s=(LQNode*)malloc(sizeof(LQNode));
	if(!s){
		exit(-1);
	}
	s->data=e;
	s->next=(*rear)->next; 
	(*rear)->next=s;
	*rear=s;
	return 1;
} 
//删除链式队列中的队头元素,并将元素赋值给e,删除成功后返回1,否则返回0
int DeQueue(LinkQueue *rear,DataType *e){
	LQNode *f,*p;
	if(*rear==(*rear)->next){
	return 0;	
	}else{
		f=(*rear)->next;
		p=f->next;
		if(p==*rear){
			*rear=(*rear)->next;
			(*rear)->next=*rear;
		}else{
			f->next=p->next;
		}
		*e=p->data;
		free(p);
		return 1;
	}
} 
int main(){
	LinkQueue LQueue1,LQueue2;
	LSNode *LStack1,*LStack2;
	char str1[]="XYZAZYX";
	char str2[]="XYZBZXY";
	char q1,s1,q2,s2;
	int i;
	//队列 
	InitQueue(&LQueue1);
	InitQueue(&LQueue2);
	//堆栈 
	InitStack(&LStack1);
	InitStack(&LStack2);
	//存储
	for(i=0;i<strlen(str1);i++){
		//入队 
		EnQueue(&LQueue1,str1[i]);
		EnQueue(&LQueue2,str2[i]);
		//进栈 
		PushStack(LStack1,str1[i]);
		PushStack(LStack2,str2[i]);
	} 
	printf("字符序列1:\n");
	printf("出队序列 出栈序列\n");
	while(!StackEmpty(LStack1)){
		DeQueue(&LQueue1,&q1);
		PopStack(LStack1,&s1);
		printf("%5c",q1);
		printf("%10c\n",s1);
		if(q1!=s1){
			printf("字符序列1不是回文!");
			return 0; 
		}
	}
	printf("字符序列1是回文\n");
	printf("字符序列2:\n");
	printf("出队序列 出栈序列\n");
	while(!StackEmpty(LStack2)){
		DeQueue(&LQueue2,&q2);
		PopStack(LStack2,&s2);
		printf("%5c",q2);
		printf("%10c\n",s2);
		if(q2!=s2){
			printf("字符序列2不是回文!");
			return 0; 
		}
	}
	printf("字符序列2是回文\n");
	return 1;

}

在这里插入图片描述

动态输入回文数:

此代码为引用代码,非本人所写。

#include <stdio.h> 
#include<stdlib.h> 
#define m 100 
 
typedef struct          //定义栈
 { 
  char data[m]; 
  int  top; 
}zhan;    

void cshz(zhan *s)      //初始化栈
{ 
  s->top=0; 
}                         

int pdzk(zhan *s)        //判断栈是否为空
{ 
  if(s->top==0)                         
  { 
    return 0; 
  } 
  else 
  { 
    return 1; 
  }              
}                        

void ruzhan(zhan *s,char x)  //入栈
{ 
  if(s->top==m)                       
   { 
     printf("栈空\n"); 
  }                         
  else                                   
   {               
     s->data[++s->top]=x;                
   } 
}                       

char chuzhan(zhan *s)        //出栈
{ 
  char y; 
  if(s->top==0)                         
  
  { 
    printf("栈空\n");    
    return '0';   
  }
  else                                 
  {     
    y=s->data[s->top];                   
    s->top=s->top-1;                       
    return y; 
  } 
}                   

typedef struct {          //定义队列
 char data[m]; 
 int  front; 
 int  rear; 
}dui;  

 void cshdl(dui *q)      //初始化队列
{ 
  q->front=q->rear=0;                            
}                          
 
void rudui(dui *q,char e)            //入队
{
  if((q->rear+1)%m==q->front)           
   { 
    printf("队列为空\n"); 
   } 
   else 
   { 
    q->data[q->rear]=e;                
    q->rear=(q->rear+1);             
   } 
}                     
 
char chudui(dui *q)         //出对
{ 
  char f; 
  if(q->front==q->rear)                 
   { 
     printf("队列为空\n");    
     return 0; 
   } 
   else 
   { 
     f=q->data[q->front];   
	 q->front=(q->front+1);            
     return f; 
   } 
}                  
  
int  main()             
{                                 
  char c; 
  int y=0; 
  zhan *s=(zhan *)malloc(sizeof(zhan)); 
  dui *q=(dui *)malloc(sizeof(dui)); 
  cshz(s);   
  cshdl(q); 
  printf("输入一个字符串:\n");
  while((c=getchar())!='@') 
  {
    ruzhan(s,c);            
    rudui(q,c); 
  } 
  while(pdzk(s))          
   { 
     if(chuzhan(s)==chudui(q)) 
     { 
      y=1;                 
      continue;            
     } 
     else                   
     { 
      y=0; 
      break;                 
     } 
   } 
   if(y==1) 
    printf("此字符串为回文\n"); 
  else 
    printf("此字符串不是回文\n");
  return 0;
} 

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值