用栈判断是否回文,急急急
- 提问者网友:乱人心
- 2021-11-28 05:33
#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字符串不为回文");
}
- 二级知识专家网友:旧事诱惑
- 2021-11-28 06:35
我的思路更加简单,你为什么不把字符串整个翻转,然后和源字符串比对不就可以了。你这样太复杂了。下边我写一个翻转的函数,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不是字符串文");
}
- 1楼网友:滚刀废物浮浪人
- 2021-11-28 09:12
- 2楼网友:樣嘚尐年
- 2021-11-28 07:49
用栈实现了判断回文数的操作,即把字符串依次入栈,然后出栈并依次和字符数组比较是否相等,从而判断字符序列是否回文数,代码如下:
#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;
}
运行结果: