数据结构——用栈解决回文字符问题

2023-05-16

回文

回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符序列是否为回文。(提示:将一半字符入栈。)

所需的知识前提:栈

以下是顺序栈的基本算法
结构表示,初始化,销毁栈,入栈,出栈,得到栈顶元素,判断栈是否为空等算法。

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#include<malloc.h>
#include<string>

typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0


// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100 	// 存储空间初始分配量
#define STACK_INCREMENT 10 	// 存储空间分配增量
typedef char ElemType;
typedef struct {
  ElemType *base; 	// 栈底指针
  ElemType *top; 	// 栈顶指针
  int stacksize; 	// 栈空间大小
} SqStack;


void InitStack(SqStack &S)
{
    // 构造一个空栈S
    if(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE 
                                  * sizeof(ElemType))))
        exit(OVERFLOW);     // 存储分配失败
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
}

void DestroyStack(SqStack &S)
{
    // 销毁栈S,S不再存在
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
}

void Push(SqStack &S, ElemType e)
{
    if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间
        S.base = (ElemType *)realloc(S.base, (S.stacksize 
              + STACK_INCREMENT) * sizeof(ElemType));
        if(!S.base)
            exit(OVERFLOW);           // 存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACK_INCREMENT;
    }
    *(S.top)++ = e;
}

Status Pop(SqStack &S, ElemType &e)
{
    // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
    // 否则返回ERROR
    if(S.top == S.base)
        return ERROR;
    e = *--S.top;
    return OK;
}

Status GetTop(SqStack S, ElemType &e)
{
    // 若栈不空,则用e返回S的栈顶元素,并返回OK;
    // 否则返回ERROR
    if(S.top > S.base) {
        e = *(S.top - 1);
        return OK;
    }
    else
        return ERROR;
}

Status StackEmpty(SqStack S)
{
    // 若栈S为空栈,则返回TRUE,否则返回FALSE
    if(S.top == S.base)
        return TRUE;
    else
        return FALSE;
}

接下来是判断回文的关键算法
参数:传入函数的字符串的首地址和字符串的长度
//思路
将字符串的每个字符一一入st栈
因为栈的特点:后进先出 LIFO(last in first out)
所以字符串的字符全部入栈后,与原来的字符串逆序
因此仅需要将栈中的数据一一出栈与原来次序字符串的字符一一对比:
若出现不相同的状况,即返回不是回文。
若字符串的比较过半(或全部进行完)时,返回是回文。

int Palindrome(char str[],  int n)
{  
   SqStack st;			//定义一个顺序栈st
   InitStack(st);		//栈初始化
   int i;
   char ch;
for (i=0;i<n;i++)		//所有字符依次进栈
      Push(st,str[i]);
i=0;				//从头开始遍历str
while (!StackEmpty(st))	//栈不空循环
{  Pop(st,ch);		//出栈元素ch
   if (ch!=str[i++])	//两字符不相同时返回0
       return 0;
}
    return 1;			//所有相应字符都相同时返回1
}

下面是关于回文问题的全部代码(可直接运行)

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#include<malloc.h>
#include<string>

typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0


// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100 	// 存储空间初始分配量
#define STACK_INCREMENT 10 	// 存储空间分配增量
typedef char ElemType;
typedef struct {
  ElemType *base; 	// 栈底指针
  ElemType *top; 	// 栈顶指针
  int stacksize; 	// 栈空间大小
} SqStack;


void InitStack(SqStack &S)
{
    // 构造一个空栈S
    if(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE 
                                  * sizeof(ElemType))))
        exit(OVERFLOW);     // 存储分配失败
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
}

void DestroyStack(SqStack &S)
{
    // 销毁栈S,S不再存在
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
}

void Push(SqStack &S, ElemType e)
{
    if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间
        S.base = (ElemType *)realloc(S.base, (S.stacksize 
              + STACK_INCREMENT) * sizeof(ElemType));
        if(!S.base)
            exit(OVERFLOW);           // 存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACK_INCREMENT;
    }
    *(S.top)++ = e;
}

Status Pop(SqStack &S, ElemType &e)
{
    // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
    // 否则返回ERROR
    if(S.top == S.base)
        return ERROR;
    e = *--S.top;
    return OK;
}

Status GetTop(SqStack S, ElemType &e)
{
    // 若栈不空,则用e返回S的栈顶元素,并返回OK;
    // 否则返回ERROR
    if(S.top > S.base) {
        e = *(S.top - 1);
        return OK;
    }
    else
        return ERROR;
}

Status StackEmpty(SqStack S)
{
    // 若栈S为空栈,则返回TRUE,否则返回FALSE
    if(S.top == S.base)
        return TRUE;
    else
        return FALSE;
}



int Palindrome(char str[],  int n)
{  
   SqStack st;			//定义一个顺序栈st
   InitStack(st);		//栈初始化
   int i;
   char ch;
for (i=0;i<n;i++)		//所有字符依次进栈
      Push(st,str[i]);
i=0;				//从头开始遍历str
while (!StackEmpty(st))	//栈不空循环
{  Pop(st,ch);		//出栈元素ch
   if (ch!=str[i++])	//两字符不相同时返回0
       return 0;
}
    return 1;			//所有相应字符都相同时返回1
}

int main()
{
	char str[100];
	printf("输入一个字符串:"); 
	gets(str);
	int len=strlen(str);
	;
	if(Palindrome(str,  len)==1) 
		printf("是回文\n");
	else 
		printf("不是回文\n");
		
		return 0; 
	
}

运行的例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——用栈解决回文字符问题 的相关文章

  • Ubuntu连接FileZilla完整方法,并且解决报错:vsftpd 530 login incorrect

    Ubuntu连接FileZilla完整方法 xff0c 并且解决报错 xff1a vsftpd 530 login incorrect 1 安装 FTP 服务 sudo apt get install vsftpd 2 开启FTP服务 xf
  • 进来教你如何解决端口被占用问题

    文章目录 关闭windows中被占用的端口 xff0c 比如我们常见的8080端口被占用了 xff0c 只需两步轻松解决问题 一 xff1a 查找端口的PID xff08 以下内容以8080端口被占用为例 xff09 二 xff1a 关闭P
  • Echarts日历组件特性分析、自定义区域颜色

    在项目中需要使用到日历分析显示数据 xff0c 官网的案例是这样的 xff1a 需求 xff1a 根据每日的数据显示自定义的颜色 查询官方API xff0c 通过设置属性 visualMap pieces 和 visualMap inRan
  • 黑盒测试用例设计方法

    文章目录 黑盒测试用例设计 xff1a 一 等价类划分法 xff08 重点 xff09 1 原理2 明确等价类划分法的原则 xff08 6条 xff09 注意事项 3 实例 x1f330 xff1a 二 边界值分析法 xff08 重点 xf
  • HTTP协议解析

    文章目录 一 HTTP协议基础1 定义2 工作原理3 特点4 与Https的区别 x1f435 HTTPS简介 xff1a 两者区别 xff1a 二 HTTP请求协议1 HTTP请求结构 xff1a 2 请求方法3 举例4 Post和Get
  • Python基础知识梳理

    目录 一 Python语言编程特征 二 基本数据类型 xff08 5个 xff09 变量 xff1a 常量 类型转换问题 三 输入 输出函数 四 运算符 1 算法运算符 2 逻辑运算符 3 成员运算符 五 随机值获取 重命名 1 获取随机值
  • 排序算法——插入排序

    目录 x1f3a8 基本介绍 x1f3b9 算法思想 x1f3f8 实例 x1f3a0 思路分析 x1fa81 代码实现 x1f6f9 算法性能分析 x1f680 时间复杂度 x1f6f4 空间复杂度 x1f6f8 稳定性 x1f3a8 基
  • 排序算法——希尔排序

    目录 x1f6f4 基本介绍 算法思想 x1f6f9 实例 思路分析 代码实现 x1f6f5 算法性能分析 x1f6f4 基本介绍 希尔排序也是一种插入排序 xff0c 它是简单插入排序经过改进之后的一个更高效的版本 xff0c 也称为见效
  • 旋转矩阵与欧拉角

    其他相关的内容网上很多 xff0c 这里就简单记录一下不同欧拉角分解顺序时 xff0c 对应的角度怎么计算 include lt opencv2 opencv hpp gt include lt iostream gt using name
  • Java中数组的5种拷贝方法

    目录 1 for循环 示例代码 2 调用clone xff08 xff09 方法 示例代码 3 Arrays类中的Arrays copyOf xff08 xff09 方法 示例代码 4 copyOfRange xff08 xff09 方法
  • MySQL 表中数据的增删改查操作

    文章目录 一 在表中插入数据 xff08 1 xff09 单条数据插入 xff08 2 xff09 插入多条数据 二 删除表中数据 三 修改表中数据 四 查询表中的数据 xff08 单表查询 xff09 1 去重查询 distinct 2
  • MySQL中多表查询、表连接(内连接和外连接)

    文章目录 表与表的关系 一对一关系 一对多关系 多对多关系 表与表之间的连接 笛卡尔积 什么是笛卡尔积 xff1a 内连接 xff1a 1 通过where关键字进行关联 2 通过inner join on进行关联 外连接 xff1a 1 左
  • MySQL中索引与事务内容总结

    文章目录 x1f440 1 一 索引介绍 1 索引的优缺点 二 索引分类 三 索引的创建与删除 1 在创建表时创建索引 2 在已经存在的表上创建索引 第一种 xff1a 通过create语法创建索引 第二种 xff1a 通过alter语法创
  • Linux Ubuntu 命令行文件系统的创建,挂载,卸载

    我在刚开始操作的时候找不到 dev sdb 即使插入了U盘 xff0c 也没出现 经过翻阅网站 xff0c 才知道要创建新的硬盘 xff08 xff09 其余默认就行 文件系统的创建 1 查看新增硬盘的信息 sudo fdisk l 2 文
  • 408-数据结构-栈应用-括号匹配&表达式求值

    括号匹配 代码中的括号通常符合一下特性 xff1a 括号成对存在左右括号通常类型匹配 xff0c 大括号匹配大括号 如果存在括号序列 xff08 xff08 xff08 xff08 xff09 xff09 xff09 xff08 xff09
  • C语言学习笔记——编写求x的n次方的递归函数,在主函数调用并输出

    题目内容 xff1a 编写求x的n次方的递归函数 xff0c 在主函数调用并输出 x为double型 xff0c n为整型 xff0c 函数类型为double型 xff09 输入格式 lf d 输出格式 xff1a f 输入样例 xff1a
  • Python 输出Print( )函数用法

    目录 print 字符串格式化 格式化符号 format格式化函数 f string print objects sep 61 39 39 end 61 39 n 39 file 61 sys stdout flush 61 False o
  • RVIZ中的fixed frame选项以及“For frame [XX]: Fixed Frame [map] does not exist”

    RVIZ 使用的时候如果fixed frame选项设置不正确 xff0c 那么就会无法显示显示相应的数据信息 xff0c 并提示一下错误 xff1a For frame XX Fixed Frame map does not exist t
  • vim/vi 4种替换方法,批量替换,手动替换

    文件内全部替换 xff1a s abc 123 g 注 xff1a 把abc替换成123 如文件内有 xff0c 可用 替换 s abc 123 g 或者 s str1 str2 g 用str2替换文件中所有的str1 xff09 文件内局
  • C++枚举与字符串之间的转换

    template lt typename EnumType gt struct SEnumName static const char List enum ProgLang e cpp e java e csharp const char

随机推荐

  • kubeadm部署k8s集群

    1 准备环境 虚拟机操作系统 Centos7 角色 IP Master 192 168 150 140 Node1 192 168 150 141 Node2 192 168 150 142 2 系统初始化工作 在三台虚拟机上进行如下操作
  • docker部署redis集群+集群扩缩容

    1 集群规划 3主3从 xff1a nameipportredis node 1192 168 150 1106381redis node 2192 168 150 1106382redis node 3192 168 150 110638
  • ceph-deploy部署指定版本ceph集群

    注意 xff1a 16版本的ceph已经不支持ceph deploy xff0c 安装方法见我的博客 xff1a cephadm快速部署指定版本ceph集群 ggrong0213的博客 CSDN博客 1 集群规划 xff1a 主机名IP组件
  • k8s集群部署Java(springboot)项目

    1 java项目打成jar包 1 1 在IDEA开发工具中使用maven工具将开发完成的SpringBoot项目达成jar包 我自己的项目生成的jar为 xff1a demojenkins jar 1 2 将生成jar包上传到装有docke
  • Netty+MongoDB集群+Kafka集群解决高并发以及实现海量数据存储

    1 环境要求 准备一台安装有Docker的虚拟机 2 Netty简单介绍 Netty 是一个高性能 异步的 基于事件驱动的 NIO 框架 Netty简化和流线化了网络应用的编程开发过程 3 MongoDB简单介绍 MongoDB是一个高可用
  • C语言:从键盘随机输入10个整数,然后输出最大值和最小值

    本题有两种解决方法 xff1a 假设法和选择排序法 1 假设法找最值 include lt stdio h gt int main int a 10 i max mini for i 61 0 i lt 10 i 43 43 scanf s
  • MySQL开启ssl证书

    由于在主从复制中数据是明文的 xff0c 所以就大大降低了安全性 因此需要借助ssl加密来增加其复制的安全性 5 6版本之上 主默认含有证书 MySQL 5 7 18 加密连接mysql ssl rsa setup span class t
  • Vmware16安装(详细)

    目录 1 安装VMware 2 创建虚拟机 3 安装centos 3 IP和主机名称配置 1 安装VMware 之前为了学习Linux系统 xff0c 买了阿里云和腾讯云的服务器 xff0c 不奈什么都没干 xff0c 号就被封了 所有想了
  • mybatis-plus 分页插件

    目录 1 前言 2 配置分页插件 2 1 selectPage 测试 2 2 自定义分页功能 1 前言 大家之前肯定都用过PageHelper来进行分页 xff0c 其实mybatisplus中也提供了一个分页插件PaginationInn
  • STM32cubeIDE学习汇总(二)----外部中断控制LED和流水灯

    基于上篇我们已经基本了解了软件界面和如何创建一个项目了 接着我们看如何利用外部按键来控制LED灯的亮灭 xff0c 即外部中断 xff08 本文讲述的是外部中断控制led取反以及如何实现流水灯 xff09 xff08 如果想了解外部中断如何
  • 技术分享 | Frida 实现 Hook 功能的强大能力

    Frida 通过 C 语言将 QuickJS 注入到目标进程中 xff0c 获取完整的内存操作权限 xff0c 达到在程序运行时实时地插入额外代码和数据的目的 官方将调用代码封装为 python 库 xff0c 当然你也可以直接通过其他的语
  • Lora超全知识归纳,对于lora和lorawan的详细介绍

    目录 LORA介绍 LoRa通讯技术 网关信道 网关负载 LoRa模块信道 节点入网 终端LoRa应用方案 设备唤醒 终端LoRa应用实践 网关详情 Lora和loraWAN LoRaWAN 概貌 LoRaWAN体系结构 LoraWAN g
  • 蒙特卡罗MCNP学习汇总(一)-----MCNP简介及编写第一个程序

    目录 简介 xff1a 什么是MC模拟 介绍 应用 运行 编写第一个程序 格式 程序 讲解 现象 简介 xff1a 什么是MC模拟 一种通过随机抽样解决数学问题的一种数值计算方法 MC方法解决的主要数学问题 数值积分问题 随机物理过程 xf
  • 蒙特卡罗MCNP学习汇总(四)--计数基础-探测器

    MCNP输入文件 Title Card Any information the user desires and describing the particular problem Cell Cards A cell is a 3D reg
  • FPGA学习汇总(六)----数码管显示(1)

    目录 概念 单个数码管显示单个数字 操作 代码 现象 分析 四个数码管定时单个显示数字 分析 代码 四个数码管同时显示 分析 代码 现象 四个数码管同时显示定时转换 分析 代码 概念 我们要搞懂数码管首先要明白几个概念 我们先看一个数码管
  • FPGA学习汇总(七)----数码管显示(2)之计数器

    目录 四位同时显示 16进制计数器 单个数码管十进制计数器 四位数码管十进制计数器 代码 分析 四位同时显示 16进制计数器 module KC8 seg dig clock input clock output 7 0 seg outpu
  • FPGA之四位led灯二进制显示

    代码 xff1a module KC419 led clk 模块名和引脚 output 3 0 led led xff08 四个 xff09 input clk 时钟 reg 3 0 led1 led 四个 reg 24 0 counter
  • JWT签名与本地计算的签名不匹配。JWT有效性无法断言,不应被信任

    JWT签名与本地计算的签名不匹配 JWT有效性无法断言 xff0c 不应被信任 错误 xff1a io jsonwebtoken SignatureException JWT signature does not match locally
  • Java判断回文(正序与反序一样)

    用户输入一串字符串 xff0c Java程序实现对该字符串判断 对回文判断主要分为三种 xff1a 1 纯数字 2 纯字母 3 混合型 1 纯数字 将输入的字符串翻转 xff0c 之后分别转换成int形式 xff0c 比较两个整数大小 xf
  • 数据结构——用栈解决回文字符问题

    回文 回文是指正读反读均相同的字符序列 如 abba 和 abdba 均是回文 xff0c 但 good 不是回文 试写一个算法判定给定的字符序列是否为回文 xff08 提示 xff1a 将一半字符入栈 xff09 所需的知识前提 xff1