C语言判断回文

#include <stdio.h>
#include <stdlib.h>
#define Stack_Init_Size 10 // 初始化栈的最大长度
#define MAXQSIZE 100       // 初始化队列的最大长度 

typedef char ElemType;
typedef char QElemType;

typedef struct {
ElemType *base; // 栈底指针
ElemType *top; // 栈顶指针
int stacksize; // 栈的最大长度
} SqStack;


// 初始化栈
InitStack(SqStack &S) {
// 分配初始空间
S.base = (ElemType *) malloc(Stack_Init_Size * sizeof(ElemType));
if (!S.base) {
exit(0);
}
S.top = S.base; /// 栈顶与栈底相同
S.stacksize = Stack_Init_Size; // 栈的最大长度等于初始长度
return 1;
}

// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可
EmptyStack(SqStack &S) {
return S.base == S.top;
}

// 进栈,参数e是要进栈的元素
Push(SqStack &S, ElemType e) {
if (S.top - S.base == S.stacksize)
return 0;
*S.top++ = e; // 先赋值,后栈顶指针上移
return 1;
}

// 出栈,参数e用来存放出栈的元素
Pop(SqStack &S, ElemType &e) {
if (S.base == S.top) {
return 0;
}
e = *--S.top; // 栈顶指针先下移,后赋值
return 1;
}

typedef struct {
QElemType *base;
int front;   //头指针
int rear;    //尾指针
} SqQueue;


//初始化队列
InitQueue(SqQueue &Q) {
Q.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType)) ;
if(!Q.base) {
exit(0);
}
Q.front=Q.rear=0;
return 1;
}

//入队
EnQueue(SqQueue &Q,QElemType e) {
if((Q.rear+1)%MAXQSIZE==Q.front)
return -1;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return 1;
}

//出队
DeQueue(SqQueue &Q,QElemType &e) {
if(Q.front==Q.rear) return -1;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return 1;
}

//获得队列长度 
QueueLength(SqQueue &Q) {
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}

//判断队列是否为空 
QueueEmpty(SqQueue &Q) {
if(Q.front==Q.rear) return 1;
else return 0;
}

//判断字符串是否回文
judge() {
SqStack S;
SqQueue Q;
char a,b,c;
InitStack(S);
InitQueue(Q);
printf("输入字符串,以'@'结束:\n");
while((a=getchar())!='@') {
Push(S,a);
EnQueue(Q,a);
}
int len = QueueLength(Q);
while(!QueueEmpty(Q)&&(!EmptyStack(S))) {
for(int i=0; i<len/2; i++) {
Pop(S,b);
DeQueue(Q,c);
}
if(b!=c) {
return 0;
} 
else {
return 1;
}
}
}
//主函数
int main() {
printf("判断回文\n");
if(judge()) {
printf("是回文");
} 
else {
printf("不是回文");
}
return 0;
}
  • 20
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W.wda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值