判断回文(c语言)

利用链栈和队列判断回文

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>



#define OK 1
#define ERROR -1
#define OVERFLOW -2

typedef char Elemtype;
typedef int status;

typedef struct node
{
	Elemtype data;
	struct node *next;
}SqStack;
typedef struct Stack
{
	SqStack *top;//栈顶
	int count;
}stack;

typedef struct q
{
	Elemtype data;
	struct q *next;
}queue;
typedef struct d
{
	queue *front,*rear;
}Queue;
int SqStack_Empty(stack *l)
{
	if(l->count==0)//为空则返回1
	{
	//	printf("栈为空!\n");
		return 1;
	}
	else
	{
	//	printf("栈不为空!\n");
		return 0;
	}
}
status push(stack *l,Elemtype e)
{
	SqStack *s;
	s=(SqStack *)malloc(sizeof(SqStack));
	if(!s)
	    exit(OVERFLOW);
	s->data=e;
	s->next=l->top;
	l->top=s;
	l->count++;
	return OK;
}
void EnQueue(Queue *Q,Elemtype e)
{
	queue *p;
	p=(queue *)malloc(sizeof(queue));
	p->data=e;
	p->next=NULL;
	if(Q->front==Q->rear)
	{
		Q->front=p;
		Q->rear=NULL;
		queue *head;
		head=(queue *)malloc(sizeof(queue));
		Q->front=head;
		head->next=p;
		Q->rear=p;
	}
	else
	{
		Q->rear->next=p;
		Q->rear=p;
	}
}
status pop(stack *l,Elemtype *e)
{
	if(SqStack_Empty(l))
		return ERROR;
	*e=l->top->data;
	SqStack *p;
	p=l->top;
	l->top=p->next;
	free(p);
	l->count--;
	return OK;
}

void DelQueue(Queue *l,Elemtype *e)
{
	if(l->front==l->rear)
		return ;
	*e=l->front->next->data;
	queue *p;
	p=l->front->next;
	l->front->next=p->next;
	free(p);
}

void main()
{
	stack *l;
	Queue *Q;
	Elemtype ch,a,b;
//	Init_SqStack(l);
	l=(stack *)malloc(sizeof(stack));
	if(!l)
		exit(OVERFLOW);
	l->count=0;
	l->top=NULL;
//	Init_Queue(Q);
	Q=(Queue *)malloc(sizeof(Queue));
	if(!Q)
		exit(OVERFLOW);
	Q->front=NULL;
	Q->rear=Q->front;

	printf("'@'为结束符\n");
	ch=getchar();
	while(ch!='@')
	{
		//putchar(ch);
		push(l,ch);
		EnQueue(Q,ch);
		ch=getchar();
	}
	while(!SqStack_Empty(l))
	{
		pop(l,&a);
		DelQueue(Q,&b);
		if(a!=b)
		{
			printf("这不是回文串!\n");
			return ;
		}
	}
	printf("这是一个回文串!\n");

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值