2025年3月22日 星期六 甲辰(龙)年 月廿一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

判断字符串是否为回文----使用栈和队列

时间:01-27来源:作者:点击数:46

前言

回文自然都懂,不多说

本文基于:

队列—先进先出

栈 —后入先出

这一结构来实现判断

算法分析

将字符串分别存储到栈和队列中之后分别输出判断是否相等

代码实现

  • #include<stdio.h>
  • #include<string.h>
  • #include"Seqstack.h"
  • #include"Seqqueue.h"
  • //相应的实现栈和队列的头文件
  • int huiwen_fun(char str[])
  • {
  • int n=strlen(str);
  • PSeqStack S;
  • PSeqQueue Q;
  • S=Init_SeqStack();
  • Q=Init_SeqQueue();
  • if(!S)
  • {
  • printf("栈初始化错误!");
  • return 0;
  • }//创建栈
  • if(!Q)
  • {
  • printf("队列初始化错误!");
  • return 0;
  • }//创建队列
  • int i;
  • for(i=0;i<n;i++) //入栈(队列)
  • {
  • In_SeqQueue(Q,str[i]);
  • Push_SeqStack(S,str[i]);
  • }
  • DataType q,s;
  • for(i=0;i<n;i++)//出栈(队列)
  • {
  • Pop_SeqStack(S,&s);
  • Out_SeqQueue(Q,&q);
  • if(s!=q) //判断是否相等
  • { printf("%s不是回文",str);
  • return 0;
  • }
  • }
  • printf("%s是回文",str);
  • Destroy_SeqQueue(&Q);
  • Destroy_Seqstack(&S);
  • return 0;
  • }
  • //主函数
  • int main()
  • {
  • char str[100];
  • printf("输入字符串:");
  • scanf("%s",str);
  • huiwen_fun(str);
  • return 0;
  • }

栈的头文件

  • //栈的头文件 --- 顺序存储
  • #include<stdio.h>
  • #include<stdlib.h>
  • #define MAXSIZE 100
  • //typedef int DataType;
  • //typedef struct
  • //{
  • // int x, y, d; //横纵坐标及方向
  • //}DataType;
  • //typedef int DataType;
  • typedef char DataType;
  • typedef struct
  • {
  • DataType data[MAXSIZE];
  • int top;
  • }SeqStack,*PSeqStack;
  • //初始化栈
  • PSeqStack Init_SeqStack(void)
  • {
  • /*创建一个顺序栈,入口参数无,返回指向顺序栈的指针*/
  • PSeqStack S;
  • S = (PSeqStack)malloc(sizeof(SeqStack));
  • if (S)
  • S->top = -1;
  • return S;
  • }
  • //判断栈空
  • int Empty_SeqStack(PSeqStack S)
  • {
  • /*判断栈是否为空 入口参数:顺序栈 返回值1为空 0非空*/
  • if (S->top == -1)
  • return 1;
  • else
  • return 0;
  • }
  • //入栈
  • int Push_SeqStack(PSeqStack S, DataType x)
  • {
  • /*在栈顶插入一个新元素,入口参数:顺序栈 返回1表示成功 0表示失败*/
  • if (S->top == MAXSIZE - 1)
  • return 0;
  • else
  • {
  • S->top++;
  • S->data[S->top] = x;
  • return 1;
  • }
  • }
  • //出栈
  • int Pop_SeqStack(PSeqStack s, DataType* x)
  • {
  • /*删除栈顶元素 并保存在*x中 入口参数 顺序栈 返回值 1表示成功 0表示失败*/
  • if (Empty_SeqStack(s))
  • return 0; //栈空不能出栈
  • else {
  • *x = s->data[s->top];
  • s->top--;
  • return 1;
  • }
  • }
  • //取栈顶元素
  • int GetTop_SeqStack(PSeqStack s, DataType *x)
  • {
  • /*取出栈顶元素 入口参数:顺序栈 返回值 1表示成功 0表示失败*/
  • if (Empty_SeqStack(s))
  • return 0;
  • else
  • *x = s->data[s->top];
  • return 1;
  • }
  • //销毁栈
  • void Destroy_Seqstack(PSeqStack* s)
  • {
  • /*入口参数:要销毁的顺序栈指针地址 无返回值*/
  • if (*s)
  • free(*s);
  • *s = NULL;
  • return;
  • }

队列的头文件

  • #pragma once
  • /*队列的顺序存储 采用头尾相连循环结构*/
  • /*入队 Q->rear = (Q->rear+1)%MAXSIZE */
  • /*出队 Q->front =(Q->front+1)%MAXSIZE */
  • #include<stdio.h>
  • #include<stdlib.h>
  • //typedef int DataType;
  • typedef char DataType;
  • #define MAXSIZE 100 /*队列最大容量*/
  • /*定义队列类型*/
  • typedef struct
  • {
  • DataType data[MAXSIZE]; /*队列存储空间*/
  • int front, rear; /*队头和队尾指针*/
  • }SeqQueue,*PSeqQueue;
  • /*初始化队列*/
  • PSeqQueue Init_SeqQueue()
  • {
  • PSeqQueue Q;
  • Q = (PSeqQueue)malloc(sizeof(SeqQueue));
  • if (Q)
  • {
  • Q->rear = 0;
  • Q->front = 0;
  • }
  • return Q;
  • }
  • /*判断队列为空*/
  • int Empty_SeqQueue(PSeqQueue Q)
  • {
  • /*入口参数 数顺序队列
  • 出口参数 1表示空 0表示非空 -1表示队列不存在 */
  • if (Q && Q->front == Q->rear)
  • return 1;
  • else
  • if (!Q)return -1;
  • else return 0;
  • }
  • /*入队*/
  • int In_SeqQueue(PSeqQueue Q, DataType x)
  • {
  • /*入口参数 顺序队列 入队元素 返回值 1表示成功 -1表示队满*/
  • if ((Q->rear + 1) % MAXSIZE == Q->front)
  • {
  • printf("队满");
  • return -1;
  • }
  • else
  • {
  • Q->rear = (Q->rear + 1) % MAXSIZE;
  • Q->data[Q->rear] = x;
  • return 1;
  • }
  • }
  • /*出队*/
  • int Out_SeqQueue(PSeqQueue Q, DataType* x)
  • {
  • /*入口参数 顺序队列 出对元素保存于*x中 返回-1表示队列为空 返回1表示出队成功*/
  • if (Empty_SeqQueue(Q))
  • {
  • printf("队空");
  • return -1;
  • }
  • else
  • {
  • Q->front = (Q->front + 1) % MAXSIZE;
  • *x = Q->data[Q->front];
  • return 1;
  • }
  • }
  • /*读队头元素*/
  • int Front_SeqQueue(PSeqQueue Q, DataType* x)
  • {
  • /*入口参数 顺序队列 元素取出存放地址 返回值1表示成功 -1表示队空*/
  • if (Empty_SeqQueue(Q))
  • {
  • printf("队空");
  • return -1;
  • }
  • else
  • {
  • *x = Q->data[(Q->front + 1) % MAXSIZE]; //循环队列队头无元素
  • return 1;
  • }
  • }
  • /*销毁队列*/
  • void Destroy_SeqQueue(PSeqQueue* Q)
  • {
  • if (*Q)
  • free(*Q);
  • *Q = NULL;
  • return;
  • }
  • /*在其余资料中也有将rear指针所指向的队列元素为空则
  • 入队Q.data[Q->rear]=x;Q->rear=(Q->rear+1)%MAXSIZE
  • 出队亦然更改*/
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门