已知:
- 栈先进后出
- 队列先进先出
如果将 一组回文数(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);
}
相关函数:
- atoi() :把一字符串转换为整数
- atol():把一字符串转换为长整形
- atof():把一个字符串转换为双精度浮点数
- strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字
- strtol():将字符串转换为长整形值,并报告不能被转换的所有剩余数字