栈解决回文

首先,先说说栈。

栈:后进先出的数据结构,它叫做栈。

回文:就是像这样:“123321”,“1221”。等就是回文。

解决方法:先把字符串前半截123或12压栈,然后再出栈和字符串后半截321比较,就OK。

上代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
判断回文
*/
int statckJudge(char *arr,int size)
{
	char temp[100] = {0};//存放前半部分
	int index = 0;
	int top = 0;//栈初始值
	int next = 0;//后半部分下标
	int mid = size/2 - 1;//中间位置
	//检测传进的指针是否为空
	if ( NULL == arr)
	{
		return -1;
	}
	//将字符串的前半部分放到temp中
	for ( ; index <= mid ;index++ )
	{
		temp[++top] = arr[index];
	}
	//求取后半部分起始下标
	if ( 0 == size%2 )
	{
		next = mid+1;
	}
	else
	{
		next = mid+2;
	}
	//判断是否为回文
	for (index = next;index < size;index++)
	{
		if ( temp[top] != arr[index] )
		{
			return -1;
		}
		top--;
	}
	if ( 0 == top )//说明全部字符成立,成立则为回文。
	{
		return 0;
	}
	else
	{
		return -1;
	}
}
int main()
{
	int sizeOfArr = 0;//输入字符串长度
	int ret = 0;//接收函数返回值
	char inputArr[100] = {0};//装载回文
	printf("请输入要判断的字符串:");
	gets(inputArr);//获取输入
	sizeOfArr = strlen(inputArr);//求取输入字符串长度
	ret = statckJudge(inputArr,sizeOfArr);//接收返回值
	//判断返回值,并做相应输出
	if ( 0 == ret)
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
	system("pause");//让它停下来
	return 0;
}
时间: 2024-10-30 13:45:52

栈解决回文的相关文章

栈之回文

#include<stdio.h> #include<string.h> #define MaxSize 100 typedef char DataType; typedef struct { DataType stack[MaxSize]; int top; }SeqStack; void StackInitiate(SeqStack *s)//初始化 { s->top=0; } int StackNotEmpty(SeqStack s)//非空否 { if(s.top&l

顺序栈来判断回文串

#include<stdio.h> #include<string> #include<iostream> using namespace std; #define StackSize 100 typedef char DataType; typedef struct{ DataType data[StackSize]; int top; }SeqStack; /*void Int(SeqStack *s){ s->top=-1; }*/ int judge(Se

疯子的算法总结(七) 字符串算法之 manacher 算法 O(N)解决回文串

有点像DP的思想,写写就会做. #include<bits/stdc++.h> using namespace std; const int maxn=1e7+5; char a[maxn]; char s[2*maxn]; int len[maxn*2]; int manachar(char *p) { int le=strlen(p); for(int i=0;i<le;i++) { s[i*2+2]=p[i]; s[i*2+1]='+'; //cout<<s[i*2+1

判断回文链表

我们之前有两篇文章写了回文串和回文序列相关的问题. 寻找回文串的核心思想是从中心向两端扩展: string palindrome(string& s, int l, int r) { // 防止索引越界 while (l >= 0 && r < s.size() && s[l] == s[r]) { // 向两边展开 l--; r++; } // 返回以 s[l] 和 s[r] 为中心的最长回文串 return s.substr(l + 1, r - l

回文判断

一个整形数是否是回文 also leetcode 9 Palindrome Number要求空间复杂度O(1)按位判断一般是/和%的游戏,首先取首位 a/h (h是最接近a的10的次方,比如12321,h预计算出是10000), 再取末位a%10; 比较首位和末位是否相等,不等就返回false; 如图: 然后舍弃掉已经比较过的两个位数,从a中去掉首尾 12321 --> 232. a = a % h; // 去掉首 a = a /10; //去掉尾 h = 100; // 因为已经去掉了两位 如

字符串回文现象的递归判断

前面谈到了递归的一些思想,还有概念上的一些理解,这里试着用递归解决一些问题.比如回文. 回文是一种字符串,它正着读和反着读都是一样的.比如level,eye都是回文.用迭代的方法可以很快地判断一个字符串是否为回文.用递归的方法如何来实现呢? 首先我们要考虑使用递归的两个条件:澳门赌场玩法 第一:这个问题是否可以分解为形式相同但规模更小的问题? 第二:如果存在这样一种分解,那么这种分解是否存在一种简单情境? 先来看第一点,是否存在一种符合条件的分解.容易发现,如果一个字符串是回文,那么在它的内部一

Manacher 算法讲解 O(N)复杂度的 最长回文子串求解

求解最长回文子串的方法很多,有几种常见的O(N^2)的最长回文子串求解方法,比如说枚举中心位置向两边扩展,动态规划等,大部分朋友应该都比较熟悉. Manacher算法相比于上面两种方法,时间复杂度是O(N),空间复杂度也是O(N),可以说是快速求解决回文子串的利器.下面介绍这一算法的思想,以及在文末给与它的实现. 我们以字符串 "ACBCABBB"为例(只考虑长度为奇数的回文串,待会会说明为何这么做),这里引入回文半径的概念,回文半径是指以该字符为中心的回文串的半径,比如ABA,B字符

Palindromic Tree 回文自动机-回文树 例题+讲解

---恢复内容开始--- 回文树,也叫回文自动机,是2014年被西伯利亚民族发明的,其功能如下: 1.求前缀字符串中的本质不同的回文串种类 2.求每个本质不同回文串的个数 3.以下标i为结尾的回文串个数/种类 4.每个本质不同回文串包含的本质不同回文串种类 (本文参考自Palindromic Tree——回文树[处理一类回文串问题的强力工具],Palindromic Tree 回文自动机-回文树 解决回文串的神器) 下面介绍一些数组的意义 next[][]类似于字典树,指向当前字符串在两段同时加

算法学习:回文自动机

[定义] [自动机] 参照AC自动机 [前置知识] [AC自动机] [manacher] 其实不学这两个也可以,但是学过之后会更方便理解 [解决问题] 主要解决回文串的问题 能求出   字符串中回文子串的长度和出现次数 #include<cstdio> #include<iostream> #include<algorithm> #include<string> #define ll long long using namespace std; const