回文

回文是指正读反读均相同的字符序列,如“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)
{// 构造一个空栈Sif(!(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;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}

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

int Palindrome(char str[],  int n)
{  SqStack st;          //定义一个顺序栈stInitStack(st);       //栈初始化int i;char ch;
for (i=0;i<n;i++)     //所有字符依次进栈Push(st,str[i]);
i=0;               //从头开始遍历str
while (!StackEmpty(st)) //栈不空循环
{  Pop(st,ch);      //出栈元素chif (ch!=str[i++])    //两字符不相同时返回0return 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)
{// 构造一个空栈Sif(!(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;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}int Palindrome(char str[],  int n)
{  SqStack st;          //定义一个顺序栈stInitStack(st);       //栈初始化int i;char ch;
for (i=0;i<n;i++)     //所有字符依次进栈Push(st,str[i]);
i=0;               //从头开始遍历str
while (!StackEmpty(st)) //栈不空循环
{  Pop(st,ch);      //出栈元素chif (ch!=str[i++])    //两字符不相同时返回0return 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; }

运行的例子


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

  1. 2003基于栈的回文字符序列判断(C++)

    描述 回文序列是正反读均相同的字符序列,如"abba"和"abdba"均是回文,但是"good"不是回文.请设计一个算法判定给定的字符序列是 ...

  2. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  3. 回文字符(第一周技术分享)

    第一篇博客就来写一下这次面试婷婷学姐问我的一个问题吧! 最开始我只会用最笨的办法把每位上的数字都写出来 再去比较首末是否相等去判断是否为回文数. #include <stdio.h> in ...

  4. C++ 栈实现回文数判断

    C++ 栈实现回文数判断 #include<iostream> #include<string> using namespace std; class Point{char d ...

  5. Python列表巧妙解决回文数判断问题

    题目: 编程:输入一个5位数字,判断这个数字是不是回文数. 运行后若输入:12345 则结果输出:不是回文数 运行后若输入:12321 则结果输出:是回文数 运行后若输入:1321 则结果输出:输入有 ...

  6. 数据结构:使用链栈实现回文判断

    题目: 回文判断 试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如'序列1&序列2'模式的字符序列.其中序列1和序列2中都不含字符'&',且序列2是序列1的逆序列.例 ...

  7. 数据结构算法题:回文数的实现

    回文是指正读反读均相同的字符序列,如'abba'和'abdba'均是回文,但'good'不是回文.试写一个算法判断给定的字符序列是否为回文 (提示:将一半的字符入栈) 思路: 从题目可知,题目要求我们 ...

  8. [动规] hihocoder 1149 回文字符序列

    题目大意 原题链接,给定字符串求回文子序列数量.字符串长度 $len \leq 1000 $. 算法思路 题干比较简单,而且数据量不大,很容易想到使用递推,关键在于如何定义递推中间值和递推式.博主做题 ...

  9. 题目2 : 回文字符序列(区间DP)

    时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串aba中,回文子序列为"a& ...

最新文章

  1. php无限极分类实例,PHP实例:PHP无限极分类
  2. 开发日记-20190724 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 14
  3. iOS开发 -------- AFNetworking使用中遇到的小问题
  4. 真的!最难啃的《深度学习》圣经花书,居然新出版了视频课!
  5. boost::gregorian模块实现使用公历精确地推进一个月的测试程序
  6. 自定义sort函数第三个参数的规则
  7. npm 安装包报错 rollbackFailedOptional
  8. hive mysql性能_Hive数据库安全审计功能
  9. 只懂 Git 就能成为架构专家?这得从代码的物理分析说起
  10. 【8-22】java学习笔记04
  11. Coins(HDU2844)
  12. Atitit 编程范式总结 目录 1.1.1. IP(Imperative Programming)指令式编程 1 1.1.2. SP(Structured Programming)结构化编程 2 1
  13. 第五章 二叉树(a)树
  14. c++语言坦克大战源代码,C++代码之坦克大战(1)(示例代码)
  15. 挂马方式研究、挂马检测技术研究
  16. GD32实战1__编程规范
  17. 云原生 Kubernetes 分布式存储平台 Longhorn 中文入门教程
  18. 迁移公众号和个人博客
  19. 详解win10开机启动慢是什么原因怎么解决
  20. js动态添加html页签(JavaScript 拼接html标签代码)

热门文章

  1. 心电图计算心率公式_心电图到底能反应啥问题,看过之后你也能当“医生”
  2. 【ArcGIS风暴】ArcGIS自动生成标识码(BSM)的两种方法案例教程
  3. ENVI IDL读写数据
  4. Android之SwipeRefreshLayout嵌套RecyclerView遇到的坑
  5. Android之SharedPreferences 存储复杂对象
  6. Andorid之Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)的用法总结
  7. Android之常见面试题
  8. python3 爬虫第三步 本文包你学会正则 不会就来锤我
  9. java程序结构_java程序结构
  10. 饿了么翻车,美团被质疑,马云也赔了40亿,这项技术为什么让人害怕?