使用堆栈检查字符串是否为回文 #包括 #包括 #包括 #包括 类型定义结构节点 { 字符数据; 结构节点*链接; }堆栈节点; void insertData(StackNode**); void push(StackNode**,char); 作废检查数据(StackNode**); bool-pop(StackNode**,char*); 已发送字符[20]=“”; void main() { StackNode*stackTop; 插入数据(&stackTop); 检查数据(&stackTop); printf(“\n”); 返回; } void insertData(StackNode**stackTop) { 字符c; 内伦; printf(“输入句子”); 而(((c=getchar())!='\n')) { 如果((c>='a'&&c='a'&&c='a'&&cdata=c; pNew->link=*stackTop; *stackTop=pNew; } 无效检查数据(StackNode**stackTop) { 字符c; int i=0; while(pop(堆叠顶部和c)) { 如果(c!=已发送[i++]) { printf(“非回文”); 返回; } } printf(“回文”); } bool pop(StackNode**stackTop,char*c) { StackNode*pNew; pNew=*stackTop; if(pNew==NULL) 返回false; *c=pNew->data; *stackTop=pNew->link; printf(“char poped%c\n”,*c); 免费(pNew); 返回true; }
我可以弹出每个字母,在exe文件不工作之后,我想我无法检查字母是否按相反顺序相同。请帮助使用堆栈检查字符串是否为回文 #包括 #包括 #包括 #包括 类型定义结构节点 { 字符数据; 结构节点*链接; }堆栈节点; void insertData(StackNode**); void push(StackNode**,char); 作废检查数据(StackNode**); bool-pop(StackNode**,char*); 已发送字符[20]=“”; void main() { StackNode*stackTop; 插入数据(&stackTop); 检查数据(&stackTop); printf(“\n”); 返回; } void insertData(StackNode**stackTop) { 字符c; 内伦; printf(“输入句子”); 而(((c=getchar())!='\n')) { 如果((c>='a'&&c='a'&&c='a'&&cdata=c; pNew->link=*stackTop; *stackTop=pNew; } 无效检查数据(StackNode**stackTop) { 字符c; int i=0; while(pop(堆叠顶部和c)) { 如果(c!=已发送[i++]) { printf(“非回文”); 返回; } } printf(“回文”); } bool pop(StackNode**stackTop,char*c) { StackNode*pNew; pNew=*stackTop; if(pNew==NULL) 返回false; *c=pNew->data; *stackTop=pNew->link; printf(“char poped%c\n”,*c); 免费(pNew); 返回true; },c,string,stack,palindrome,C,String,Stack,Palindrome,我可以弹出每个字母,在exe文件不工作之后,我想我无法检查字母是否按相反顺序相同。请帮助 我花了一整天的时间来编写这个程序,但我现在已经陷入困境。你可以使用隐式调用堆栈吗 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> typedef struct node { char data; struct node *link;
我花了一整天的时间来编写这个程序,但我现在已经陷入困境。你可以使用隐式调用堆栈吗
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct node
{
char data;
struct node *link;
}StackNode;
void insertData(StackNode **);
void push(StackNode **, char);
void checkData(StackNode **);
bool pop(StackNode **,char *);
char sent[20] = "";
void main()
{
StackNode *stackTop;
insertData(&stackTop);
checkData(&stackTop);
printf("\n");
return;
}
void insertData(StackNode **stackTop)
{
char c;
int len;
printf("Enter the Sentence\n");
while( ( ( c = getchar() ) != '\n'))
{
if( ( ( c>='a' &&c<='z') || (c>='A' && c<='Z')))
{
if((c>='A' && c<='Z'))
{
int rem;
rem = c-'A';
c='a' + rem;
}
push(stackTop,c);
len = strlen(sent);
sent[len++]=c;
sent[len]='\0';
}
}
printf("Letters are %s\n\n",sent);
}
void push(StackNode **stackTop,char c)
{
StackNode *pNew;
pNew = (StackNode*) malloc(sizeof(StackNode));
if(!pNew)
{
printf("Error 100:Out of memory\n");
exit(100);
}
pNew->data = c;
pNew->link = *stackTop;
*stackTop = pNew;
}
void checkData(StackNode **stackTop)
{
char c;
int i=0;
while(pop(stackTop,&c))
{
if( c !=sent[i++])
{
printf("Not palindrome");
return;
}
}
printf("Palindrome");
}
bool pop(StackNode **stackTop,char *c)
{
StackNode *pNew;
pNew = *stackTop;
if(pNew == NULL)
return false;
*c = pNew->data;
*stackTop = pNew->link;
printf("char poped %c\n",*c);
free(pNew);
return true;
}
int是pal(常量字符*开始,常量字符*结束)
{
如果(*开始!=*结束)
返回0;
如果((结束-开始)<2)
返回*开始==*结束;
返回为_pal(开始+1,结束-1);
}
我不知道您为什么要这样做,但这是一种方法
把所有的东西都堆起来
然后从一开始就将所有内容与字符串的元素进行比较
对于(int i=0;i堆栈节点*stackTop
(在main中)它指向垃圾并且不是空的。因此,当你检查回文时,你的pop方法会一直离开堆栈的末尾,并且永远不会返回false,因为它从来没有碰到空值。StackNode*stackTop=null;
应该可以解决你的问题。我不确定我是否得到了“使用棍子”的提示part…!?@H2CO3,stick->stack。如果你想批准它,有一个待定的编辑。@CarlNorum啊,谢谢,是的……你为什么要使用堆栈?@Sukunt,因为我正在学习堆栈:)非常感谢!!这对我很有帮助。我会永远记住你说过的话。@user2509877不客气。同样,你应该将malloc返回给你的内存设置为0。pNew=(StackNode*)malloc(sizeof(StackNode));memset(pNew,0,sizeof(StackNode))
另外,想想如果有人输入超过20个字符会发生什么情况。你不是在检查输入是否适合发送的数组。你可能想检查插入数据中len
小于20的while循环。只要记住C允许你用内存做任何你想做的事情,所以你必须注意不要覆盖正在用于其他用途的内存,也不要覆盖内存中实际存在的内容(即,如果您希望它为空或null,则为空)。“在C中编程时,您应该始终将指针初始化为null”-我不能恰好同意这一点。它没有那么简单。@H2CO3您能详细说明一下吗?
int is_pal(const char *begin, const char *end)
{
if (*begin != *end)
return 0;
if ((end - begin) < 2)
return *begin == *end;
return is_pal(begin + 1, end - 1);
}