这个和项目配置有关,项目配置的启动项配的不对,所以找不到
【相关推荐】
判断思路如下:将字符串前一半入栈,然后,栈中元素和字符串后一半进行比较。即将第一个出栈元素和后一半串中第一个字符比较,若相等,则再出栈一个元素与后一个字符比较,……,直至栈空,结论为字符序列是回文。在出栈元素与串中字符比较不等时,结论字符序列不是回文。
代码如下
#include<stdio.h>
#define maxsize 30
/*顺序静态栈*/
typedef struct Stack
{
char data[maxsize];
int top;//栈顶指针
}stack;
/*静态串*/
typedef struct Strand
{
char data[maxsize];
int length;//串的实际长度
}strand;
/*初始化栈*/
void Initialize_stack(stack& S)
{
S.top = 0;
}
/*初始化串*/
void Initialize_strand(strand& L)
{
L.length = 0;
}
/*压栈*/
void pushstack(stack& S, char c)
{
S.data[S.top] = c;
S.top++;
}
/*入串*/
void pushstrand(strand& L, char c)
{
L.data[L.length] = c;
L.length++;
}
/*出栈*/
char popstack(stack& S)
{
S.top--;
return S.data[S.top];
}
/*出串*/
char popstrand(strand& L, int i)//增加一个参数i,使得从串头依次输出字符
{
return L.data[i];
}
/*栈中数据出栈与串后一半比较*/
void compare(stack& S, strand& L)
{
char a, b;
/*
其实不管是输入的字符串是奇数还是偶数,他们比较的次数始终是成对出现的,
偶数的话很容易理解,对于奇数的话,中间的那个字符是不需要比较的,所以,
只需要比较两边的字符即可,而:比较的次数=栈中的字符数=串中的字符数,
也就是说: int m = S.top ;等价于 int m = L.length;
*/
int m = S.top;
int i = 0;
char popstack(stack & S);
char popstrand(strand & L, int i);
printf("运算结果:");
for (i = 0; i < m; i++)
{
a = popstack(S);//调用出栈函数,把栈顶字符赋给a
b = popstrand(L, i);//调用出串函数,把栈顶字符赋给b
/*
下面的代码采用逆推的方式思考:
如果字符串是回文,满足条件是:每一次的比较必须是相等的,也就是说:最后一次的比较是确定是否为回文的关键因素
如果字符串不是回文,满足条件是:只需要有一次比较不相等即可
*/
if (i == m - 1) //最后一次比较,如果a,b相等了,那么就一定是回文
{
if (a == b)
{
printf("这是回文\n");
}
}
if (a != b)
{
printf("这不是回文\n");
i = m; //只需要有一次比较是不相等,就不需要再继续循环比较了,直接给i赋值跳过循环即可
}
}
}
/*主方法*/
int main()
{
stack S;
strand L;
int j = 0, k = 0, i = 0;
char str[maxsize], c;
void pushstack(stack & S, char c);
void pushstrand(strand & L, char c);
void compare(stack & S, strand & L);
void Initialize_stack(stack & S);
void Initialize_strand(strand & L);
Initialize_strand(L);
Initialize_stack(S);
printf("请输入想要查询的字符串:");
gets_s(str);
for (int i = 0; i < maxsize; i++)//设置一个计数器,找出实际输入个数
{
if (str[i] == '\0')//当字符为 '\0'时,执行此段语句
{
j = i;//此时把i的值赋予j,而j就是输入数据的实际个数
}
}
k = j;//中间数据,在后部分字符串入串的时候需要用到
if (j % 2 == 0)//如果传入的字符串是偶数个,执行以下代码
{
j = j / 2;
/*把字符串的前一半传入栈中*/
for (i = 0; i < j; i++)
{
c = str[i];
pushstack(S, c);
}
/*把字符串的后一半传入串中*/
for (i = j; i < k; i++)
{
c = str[i];
pushstrand(L, c);
}
}
else if (j % 2)//如果传入的字符串是奇数个,执行以下代码
{
j = (j - 1) / 2;
/*把字符串的前一半传入栈中*/
for (i = 0; i < j; i++)
{
c = str[i];
pushstack(S, c);
}
/*把字符串的后一半传入串中*/
for (i = j + 1; i < k; i++)
{
c = str[i];
pushstrand(L, c);
}
}
compare(S, L);//调用比较函数
return 0;
}
运行结果:
如果有什么不合适的地方,还请指出。。。