回文

//2022.9.28 回文的实现(数值)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//定义单链表节点类型
typedef struct qlink {
int data; //数据域
struct qlink* next;//指针域
}qlink;


//定义链队列的类型
typedef struct linkqueue {
qlink* front;//队头指针
qlink* rear;//队尾指针
}linkq;

linkq q;//定义一个链队列

//初始化链队列
void initqlink() {
q.front = (qlink*)malloc(sizeof(qlink));
if (!q.front)
exit(0);
q.front->next = NULL;
q.rear = q.front;//空队列
}

//入队(插入)
void enqlink(int e) {
qlink* p;
p = (qlink*)malloc(sizeof(qlink));
if (!p)
exit(0);
p->data = e;
p->next = NULL;
q.rear->next = p;//连接作用
q.rear = p;//修改队尾指针
}

//出队(删除)
int deqlink() {
qlink* p;
int x;
if (q.rear == q.front) {
printf("空队列,不进行删除\n");
exit(0);
}
p = q.front->next;
x = p->data;
q.front->next = p->next;
if (p == q.rear)//如果队尾指针没有,空队列
q.rear = q.front;
free(p);
return x;

}
#define N 20

//定义顺序栈的类型
typedef struct sqstack {
int* base; //栈底指针
int* top; //栈顶指针
int stacksize; //存储空间大小
}sqs;

sqs s; //定义一个顺序栈

//初始化
void initstack() {
s.base = (int*)malloc(N * sizeof(int));
if (!s.base)
exit(0);
s.top = s.base; //空栈
s.stacksize = N;
}

//入栈(插入元素)
void push(int e) {
if (s.top - s.base >= s.stacksize) {
printf("栈满\n");
exit(0);
/*s.base=(int *)realloc(s.base,(N+M)*sizeof(int))
if(!s.base) exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=M;
*/
}
*s.top = e; //插入
s.top++; //修改栈顶指针
}

//出栈(删除)
int pop() {
int e;
if (s.top == s.base) {
printf("空栈\n");
exit(0);
}
s.top--;//修改栈顶指针
e = *s.top;//赋值
return e;
}
//判断是否为回文
void judge() {
int e, n, x = 0, y = 0;
initstack();
initqlink();
printf("请输入数值长度:");
scanf("%d", &n);
printf("请输入数值:");//逐个输入元素
for (int i = 1; i <= n; i++) {
scanf("%d", &e);
push(e);
enqlink(e);
}
int b = n;//第一个循环n--到0了,需要将n赋给另一个变量
while (s.top != s.base)
{


x = x + pop() * pow(10,n);
n--;
}
printf("输出x的值");
printf("%d", x/10);//将各个元素合在一起化成数值
printf("\n");
while (q.rear != q.front)
{

y = y + deqlink() * pow(10, b );
b--;

}
printf("输出y的值");
printf("%d", y/10);//将各个元素合在一起化成数值
printf("\n");
if (x == y)//比较是否相等判断是否为回文
printf("该数值是回文");
else
printf("该数值不是回文");

}
/*这里面有个问题,就是pow()里面的n如果等于n-1的话出来的结果不正确,不知道为什么,
在vs studio里面是正常的,但只要把他变成n,在输出的时候再除上一个10就行了*/
void main() {
judge();
}