回文:
指正读反读均相同的字符序列,如“abba”、“abdba”、12321均是回文
解题思路:
基于栈的先进后出,后进先出的特点,可以用一个字符指针保存原来的字符串,再让待测字符串进栈,再出栈,将指针与字符串比较
代码实现:(C)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct Node {
char *base;//指向栈底
char *top;//指向栈顶
int size;
//size = 99;
}*stack;
stack init(){//栈的初始化
//int n;
stack s = (stack)malloc(sizeof(stack));
s->base = (char*)malloc(sizeof(char)*MAXSIZE);
if(!s->base)
return NULL;
//scanf("%d",&n);
s->size = MAXSIZE;
printf("初始化成功\n");
s->top = s->base;
s->size = MAXSIZE;
return s;
}
int full_stack(stack s){//判断是否栈空
if(s->top - s->base == MAXSIZE)
return 1;
else
return 0;
}
int empty_stack(stack s){
if(s->top == s->base)
return 1;
else
return 0;
}
void push_stack(stack s,char n){//压栈
if(full_stack(s) == 1){
printf("已经栈满,无法添加!\n");
return;
}
else {
*(s->top++) = n;
//printf("入栈成功\n");
}
}
void pop_stack(stack s,char &e){//c++中,传入参数为&+变量名,会使传入参数的值永久改变
if(empty_stack(s) == 1){
printf("已经栈空!\n");
return ;
}
else{
e = *(--s->top);
}
}
void getTop(stack s,char*e){
if(empty_stack(s) == 1){
printf("已经栈空!\n");
return ;
}
*e = *s->top;
}
//具体思路:让待判断的数依次入栈再出栈,判断前后是否一致
int main(){
char fir[MAXSIZE];
char *p1,*p;
printf("请输入数据\n");
//scanf("%s",p1);
gets(fir);
int len = strlen(fir);
p1 = (char*)malloc(sizeof(char)*len);
strcpy(p1,fir);
len = strlen(p1);
stack s = init();
//printf("pause\n");
int i;
for(i=0;i<len;i++)
{
push_stack(s,fir[i]);
p = s->top;
printf("%c\n",*--p);
}
char temp;
for(i=0;i<len;i++){
pop_stack(s,temp);
fir[i] = temp;
printf("%c\n",fir[i]);
}
int bol = strcmp(p1,fir);
if(bol == 0)
printf("是回文\n");
else
printf("不是回文\n");
}