中易网

用栈判断是否回文,急急急

答案:3  悬赏:60  
解决时间 2021-11-28 13:07
自己写的程序如下 检验没有错误 但就是结果输出不对,求大神解答啊!!
#include<stdio.h>
#include <string.h>
#include <stdlib.h>

typedef char ElemType;

typedef struct linknode
{
ElemType data;
struct linknode *next;
}LiStack;

void InitStack(LiStack *s)
{
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
}

void push(LiStack *s, ElemType e)
{
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}

ElemType pop(LiStack *s, ElemType e)
{
LiStack *p;
if(s->next==NULL)
return 0;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return e;
}

int compare(ElemType str[])
{
int i,m;

ElemType e=' ';
LiStack *s=NULL;
m=10;
for(i=0;i<m;i++)
{
scanf("str[i]\n",e);
}

InitStack(s);
for(m=0;str[m]!='\0';m++)
for(i=0;i<(m+1)/2;i++)
{
push(s,str[i]);
}
pop(s,e);
for(i=m/2;i<m;i++)
if(str[i]!=e)
return 0;
else
return 1;
return 0;
}

void main()
{
ElemType str[50];
printf("输入字符串:");
scanf("%s",str);
if(compare(str))
printf("\n字符串为回文");
else
printf("\n字符串不为回文");

}
最佳答案
我没仔细看你的代码,但是我觉得你想的复杂了,所以你的编程看起来十分分复杂。
我的思路更加简单,你为什么不把字符串整个翻转,然后和源字符串比对不就可以了。你这样太复杂了。下边我写一个翻转的函数,c++的泛型。应该很容易改成C语言。
#include<assert.h>
#include<algorithm>
template<class T>
void Rerverse(T *begin, T* end)
{
    assert(begin < end);
    if (begin < end)
    {
        swap(*begin, *end);
        begin++;
        end--;
    }
}你的程序里面这个是不对的,你的s事传不回来的,这地方你需要使用二级指针,还有其他错误,我直接修改了你的代码,请看下边
 void InitStack(LiStack *s)
{
  s=(LiStack *)malloc(sizeof(LiStack));
  s->next=NULL;
}
#include<stdio.h>
#include <string.h> 
#include <stdlib.h>

typedef char ElemType;

typedef struct linknode
{
  ElemType data;
  struct linknode *next;
}LiStack;

void InitStack(LiStack **s)
{
  *s=(LiStack *)malloc(sizeof(LiStack));
  (*s)->next=NULL;
}

void push(LiStack *s, ElemType e)
{
  LiStack *p;
  LiStack *temp = s;
  while(NULL != temp->next)
  {
    temp = temp->next;
  }
  p=(LiStack *)malloc(sizeof(LiStack));
  p->data=e;
  p->next=NULL;
  temp->next=p;
  temp = p;
}

ElemType pop(LiStack *s)
{
   LiStack *p = s;
   LiStack *temp = s;
   ElemType e;
   if(p->next==NULL)
       return NULL;
   while(NULL != p->next)
  {
    temp = p;
    p = p->next;
  }
   e=p->data;
   temp->next = NULL;
   free(p);
   return e;
}

bool compare(ElemType str[])
{
  int i,m;
  bool flag = true;
  ElemType e=' ';
  LiStack *s=NULL;
  
  InitStack(&s);
  for(i = 0; i < strlen(str); i++)
  {
    push(s,str[i]);
  }
  for(i = 0; i < strlen(str); i++)
  {
    if (str[i] != pop(s))
    {
        flag = false;
        break;
    }
  }
  return flag;
}

void main()
{
  ElemType str[50];
  printf("输入字符串:");
  scanf("%s",str);
  if(compare(str))
      printf("\n是字符串文");
      else
      printf("\n不是字符串文");

}
全部回答
#include<stdio.h> #include <string.h>  #include <stdlib.h> typedef char ElemType; typedef struct linknode {    ElemType data;    struct linknode *next; }LiStack; void initStack(LiStack *&s) {  s = (LiStack *)malloc(sizeof(LiStack));  s->next = NULL; } bool isEmpty(LiStack *s) {  if (s == NULL)   initStack(s);  return s->next == NULL; } void push(LiStack *s, ElemType e) {  LiStack *p;  p = (LiStack *)malloc(sizeof(LiStack));  p->data = e;  p->next = s->next;  s->next = p; } bool pop(LiStack *s, ElemType &e) {  LiStack *p;  if (isEmpty(s))   return false;  p = s->next;  e = p->data;  s->next = p->next;  free(p);  return true; } bool compare(ElemType str[]) {  LiStack *s = NULL;  initStack(s);  ElemType e;  int len = strlen(str);  for (int i = 0; i < len / 2; i++)   push(s, str[i]);  for (int i = (len + 1) / 2; i < len; i++)   if(pop(s, e) && e != str[i])    return false;  return isEmpty(s); } int main() {  ElemType str[50];  printf("输入字符串: ");  while (scanf("%s", str) != EOF)  {   if (compare(str))    printf("字符串%s为回文.\n", str);   else    printf("字符串%s不为回文.\n", str);   printf("输入字符串: ");  }  return 0; }

用栈实现了判断回文数的操作,即把字符串依次入栈,然后出栈并依次和字符数组比较是否相等,从而判断字符序列是否回文数,代码如下:

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#defineempty0

#definefull10000

#definemax10000

typedefchardata;

typedefstructelem{

datad;

structelem*next;

}elem;

typedefstructstack{

intcnt;

elem*top;

}stack;

voidinitialize(stack*stk);

voidpush(datad,stack*stk);

datapop(stack*stk);

boolempty(conststack*stk);

boolfull(conststack*stk);//栈操作函数

voidinitialize(stack*stk)

{

stk->cnt=0;

stk->top=null;

}

boolempty(conststack*stk)

{

returnstk->cnt==empty;

}

boolfull(conststack*stk)

{

returnstk->cnt==full;

}

voidpush(datad,stack*stk)

{

elem*p;

if(!full(stk))

{

p=(elem*)malloc(sizeof(elem));

p->d=d;

p->next=stk->top;

stk->top=p;

stk->cnt++;

}

}

datapop(stack*stk)

{

datad;

elem*p;

if(!empty(stk))

{

d=stk->top->d;

p=stk->top;

stk->top=stk->top->next;

stk->cnt--;

free(p);

}

returnd;

}

intmain(void)

{

datainput[max];

stacktemp;

inti=0;

intflag=0;

initialize(&temp);//初始化临时栈

scanf("%s",&input);//输入字符串

while(input[i]!='@')

{//字符串入栈

push(input[i],&temp);

i++;

}

while(!empty(&temp))

{//字符依次出栈和字符数组比较,判断是否回文数

if(temp.top->d==input[flag])

{

pop(&temp);

flag++;

}

else

{

printf("此字符序列不是回文数!\n");

break;

}

}

if(empty(&temp))

printf("此字符序列是回文数!\n");

return1;

}

运行结果:

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
英雄联盟Love丨No灬XX的名字起个战队名
哪里能看完小爸爸全集
找小说!!!
有没有类似于长江七号、宝葫芦的秘密的电影
儿女多家庭条件都不太好老人赡养费应该怎么出
新车居汽车美容装具地址有知道的么?有点事想
请人帮我整理一个八月去上海玩4天左右的路线
打算考注会,请问有没有必要考会计从业资格证
直径25*2.5的不锈钢无缝管有多重?
吴亦凡唱的小时代3的片尾曲是什么
刚刚满18可以0首付购车吗?
科目二考试半坡起步边线大于30是扣10吗
我妈妈吃了头痛粉,脸肿了,眼睛都看不到了
87版红楼梦女演员的身高谁最高
nba2konline哪些pg可以扣篮
推荐资讯
微薄的近义词
9千米等于多少米
72年5.18号是什么星座
女朋友是护士、她在上班、我去看她的时候应该
食母的意思是什么啊?请解释下!
广州北京路有旗袍专卖店吗?
怎样给孩子断奶?急急急
太平乡林场小学地址好找么,我有些事要过去
积水潭医院间椎镜微创主治医生哪个好我妈半年
为什么狙击精英3的下载任务里面的‘’野兽之
不想上班了,想创业做点生意,卖手抓饼怎么样
中山市刺猬紫檀家具厂各位有推荐的吗?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?