C语言|链栈和链队列实现回文数判断

已知:

  • 栈先进后出
  • 队列先进先出

如果将 一组回文数(eg:123321)从中间分开(123和321)分别传入栈和队列中,那么他们出栈、队列的顺序依次为(321和321)
那么比较每一次出栈/队列的数字就可以比较一串数字是否为回文数。

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

typedef struct snode
{
	char data;                 //出于方便使用了字符
	struct snode* next;
}Snode, * LinkStack;
typedef struct qnode
{
	char data;
	struct qnode* next;
}Qnode,*QueueLink;
typedef struct
{
	QueueLink front;
	QueueLink rear;
}QLink;
int initStack(LinkStack* LS)
{
	*LS = NULL;
	return 1;
}
int initQueueLink(QLink* QL)
{
	QL->front = QL->rear = (QueueLink)malloc(sizeof(Qnode));
	if (QL->front == NULL)
		return 0;
	QL->front->next = NULL;
	return 1;
}
int StackEmpty(LinkStack* LS)
{
	if (*LS == NULL)
		return 1;
	else
		return 0;
}
int QueueEmpty(QLink QL)
{
	if (QL.front == QL.rear)
		return 1;
	else
		return 0;
}
int StackLength(LinkStack* LS)
{
	LinkStack p = *LS;
	int n = 0;
	while (p != NULL)
	{
		p = p->next;
		n++;
	}
	return n;
}
int QueueLength(QLink QL)
{
	QueueLink p = QL.front->next;
	int n = 0;
	if (QL.front == QL.rear)
		return 0;
	while (p)
	{
		n++;
		p = p->next;
	}
	return n;
}
int GetStackHead(LinkStack *LS)
{
	if (StackEmpty(LS))
		return 0;
	else
	return (*LS)->data;
}
int GetQueueHead(QLink QL)
{
	if (QueueEmpty(QL))
		return 0;
	return QL.front->next->data;
}
int StackPush(LinkStack* LS, char e)
{
	LinkStack p = (LinkStack)malloc(sizeof(Snode));
	p->data = e;
	p->next = *LS;
	*LS = p;
	return 1;
}
int QueuePush(QLink* QL, char e)
{
	QueueLink p = (QueueLink)malloc(sizeof(Qnode));
	p->data = e;
	p->next = NULL;
	QL->rear->next = p;
	QL->rear = p;
	return 1;
}
int StackPop(LinkStack* LS)
{
	if (StackEmpty(LS))
		return 0;
	LinkStack p = *LS;
	*LS = p->next;
	free(p);
	return 1;
}
int QueuePop(QLink* QL)
{
	if (QueueEmpty(*QL))
		return 0;
	QueueLink p = QL->front->next;
	QL->front->next = p->next;
	if (QL->rear == p)
		QL->rear = QL->front;
	free(p);
	return 1;
}
/*int StackPrint(LinkStack LS)
{
	LinkStack p = LS;
	while (p)
	{
		printf("%c     ", p->data);
		p = p->next;
	}
	printf("\n");
	return 1;
}
int QueuePrint(QLink QL)
{
	QueueLink p = QL.front->next;
	while (p)
	{
		printf("%c      ", p->data);
		p = p->next;
	}
	printf("\n");
	return 1;
}           查bug时用的
*/
int palindrome(LinkStack LS, QLink QL)          //回文判断
{
	if (StackLength(&LS) != QueueLength(QL)) 
		return 0;
	while (!StackEmpty(&LS))
	{
		int e1,e2;
		if (GetStackHead(&LS) != GetQueueHead(QL))           //比较头结点
			return 0;
		else
		{
			StackPop(&LS);          //比较完了就删掉
			QueuePop(&QL);
		}
	}
		return 1;
}
int main()
{
	LinkStack LS;
	QLink QL;
	initStack(&LS);
	initQueueLink(&QL);

	printf("请输入一组不超过20的数,以&为前后划分,以#为结尾:\n");      //20随便定的,只要字符串空间足够大,输入不需要限制
	int flag = 0;
	char num[30];
	scanf("%s", &num);
	for (int i = 0;num[i] != '#'; i++)
	{
		if (num[i] == '&')
		{
			flag = 1;          //判断&前后
			continue;          
		}
		if (!flag)
			StackPush(&LS, num[i]);
		else 
			QueuePush(&QL, num[i]);
	}
	if (palindrome(LS, QL))
		printf("%s是回文数\n", num);
	else
		printf("%s不是回文数\n", num);
}

一个没有使用的小知识点

字符串转化为数组:

#include<stdio.h>
int main()
{
	char str[] = "1234";
	int  num[4];
	for (int i = 0; i < 4; i++)
		num[i] = int(str[i] - '0');
	for (int i = 0; i < 4; i++)
		printf("%d    ", num[i]);
}

字符串转化为整型数字:

#include<stdio.h>
#include <stdlib.h>
int main()
{
	char str[] = "1234";
	int  num = atoi(str);
	printf("%d", num);
}

相关函数:

  1. atoi() :把一字符串转换为整数
  2. atol():把一字符串转换为长整形
  3. atof():把一个字符串转换为双精度浮点数
  4. strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字
  5. strtol():将字符串转换为长整形值,并报告不能被转换的所有剩余数字
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值