【问题标题】:Palindrome - removing the goto回文 - 删除 goto
【发布时间】:2010-12-13 12:58:44
【问题描述】:

美好的一天! 我们的老师要求我们确定一个单词或一系列数字是否是回文或不使用堆栈。我已经完成了。但是我想练习更多所以现在我试图通过删除空格和其他不相关的字符来确定一个句子是否是回文(注意:不再是我的家庭作业的一部分)我的代码已经在工作(希望如此)但我发现它很乱。所以我想改进它。我想删除 goto 功能,因为我的老师建议我不要使用它。如何使用 goto 函数退出 if 语句?先感谢您。还有其他方法可以检查一个句子是否是回文,因为我的代码是用蛮力方法完成的。我的代码如下:注意(我没有在此处包含/粘贴结构和弹出和推送功能)

int main(){
   char word[11];
   char temp[11];
   char value;
   int i=0, x=0, n=0, length=0; 
   Stack*head = NULL;
   printf("Please type the word: ");
   gets(word);
   length = strlen(word);
   while(i<length){
       if(isspace(word[i]) || !isalpha(word[i]))  {
           if(isdigit(word[i])) goto NEXT;  // i used the goto function here
           i++; 
           continue;
       }
       NEXT:
       temp[n]=word[i];
       push(&head, word[i]);
       i++;
       n++;
   }
   temp[n]='\0';
   while(x<n){
       value = pop(&head);         
       if (value==temp[x]){ 
           x++; 
           continue;
       }
       break;
   }    
   if(x==n) printf("Yehey! It is a palindrome.");
   else printf("Sorry, It is not a palindrome.");
   getch();
}

根据您的建议。这是我改进的代码:

int main(){
   char word[11];
   char temp[11];
   int i=0, n=0; 
   int flag = 1;
   Stack*head = NULL;
   printf("Please type the word: ");
   fgets(word, 11, stdin);
   for(i = 0; word[i]!='\0' ; i++){
       if(isalnum(word[i])) {
           temp[n]=word[i];
           push(&head, word[i]);
           n++;
       }
   }
   temp[n]='\0';
   for(i=0; temp[i]!='\0'; i++){
       if (pop(&head)!=temp[i]){ 
          flag = 0;
          break;
       }
   }    
   if (flag==1) printf("Yehey! It is a palindrome.");
   else printf("Sorry, It is not a palindrome.");
   getch();
}

【问题讨论】:

  • 我还建议您停止使用 gets() 函数。请改用 fgets(),这样即使输入 11 个或更多字符,也不会破坏堆栈。

标签: c palindrome


【解决方案1】:

您可以进行的最简单的更改如下:

   ...
   if(isspace(word[i]) || !isalpha(word[i]))  {
       if(!isdigit(word[i])) {
           i++; 
           continue;
        }
   }
   temp[n]=word[i];
   ...

您还可以做一些其他的事情来整理代码(例如,合并 if 语句,去掉 isspace,因为 !isalpha 涵盖了这些,等等)。

【讨论】:

  • @aix 我不能使用 continue.. huhuhhu 因为它会跳过 temp[n]=word[i];推(&头,字[i]);我++; n++;??
  • 为什么不直接连接两个if 语句?
  • @newbie:这是因为 !isdigit() 之前的原因 - 他扭转了测试。
  • 定义“不再工作”。你确定它以前有效吗?
  • @newbie:也可以在其他人的答案中查看我的 cmets。如果你想要字母和数字,只需使用isalnum()。这也许不是一个真正的问题,更多的是讨论。我希望我们可以在更对话的环境中讨论这个问题,这样我就可以给你一个适当的代码审查,讨论为什么和原因。
【解决方案2】:

我喜欢你的态度。

首先,您在这里尝试做的是嵌套两个本质上是一个的逻辑语句。您还使用了错误的函数来确定字符类型:

如果isspace(word[i]) 那么你可以保证!isalpha(word[i])。这两个陈述总是同时为真或假,因此其中一个是多余的。你真正在做的只是在字母数字的情况下推动字符,对吗?因此,与其使用 if 语句来确定是否要跳过字符,不如使用 if 语句来确定是否要推送字符。我认为isalnum() 可能是您想要的。

其次,而不是执行 strlen() 迭代字符串并使用返回值迭代字符串(这使得两次)尝试:

while('\0' != word[i])

甚至更好:

for(i = 0; '\0' != word[i]; i++)

最后,您的回文测试可以稍微简化一下。在循环之后测试循环值在所有情况下都有效,但有点难看。它也不会甘愿忍受傻瓜。在专业环境中,您会遇到很多人,有些人不那么认​​真,他们编辑代码并在循环后使用循环值可能会有风险。也许取而代之的是一个名为“match”的bool并将其初始化为true,然后循环直到堆栈结束或“match”变为false并将“match”设置为false,如果堆栈上的字符不“匹配”期望值。这样也会更有效率。


当原始问题显然被删除时,我正在撰写此答案。

如果您希望我发布代码示例,我很乐意这样做,但如果我不这样做,您可能会学到更多。如果你想要一个代码示例,或者想让我看看你在这个答案之后想出什么,请随意。

【讨论】:

  • 抱歉删除了我之前的问题.. :)
  • @Newbie:不用担心。我已经完成更新了。
  • @Newbie:非常好。看看它有多短和简单?我现在倾向于做的唯一改变是风格。例如,一两行空白会更好地使其更具可读性。此外,if(1 == flag) 优于 if(flag == 1)。如果你的手指僵硬而错过了=,那么你会得到一个编译错误,而不是一个很难发现的错误。当你开始使用它时感觉很奇怪(我第一次看到它时并不喜欢它)但它在过去为我节省了好几次工作。
  • 非常感谢您对我的帮助!你是最好的!上帝保佑!
【解决方案3】:

我只是看了一眼..可能是误会:

while(i<length){
   if(isalnum(word[i]))  {
       temp[n]=word[i];
       push(&head, word[i]);
       n++;

   }
   i++;

}

【讨论】:

  • 更好,但不需要继续,并且i++ 对两个部分都是通用的,因此将其从if...else 语句中删除。同样isalnum()isalpha() || isdigit() 相同。
【解决方案4】:

对于这么短的跳转,重写以消除问题是微不足道的。

while(i<length){
   if(isspace(word[i]) || !isalpha(word[i]))  {
       if(!isdigit(word[i])) {
           i++;
           continue;
       }
   }
   temp[n]=word[i];
   push(&head, word[i]);
   i++;
   n++;
}

【讨论】:

  • 与前三个人的答案相同,但仍然没有连接 if 语句。或删除多余的测试。 if(!isalnum(word[i])) 相当于这里的if 语句,但仍然不是最佳的整体解决方案。
  • @AlastairG:他就一个具体问题寻求帮助,我解决了。如果他想要剩下的,他可以问。
  • @DeadMD:她说她想改进所有代码,并专门删除“goto”。她还明确表示她是一名学生,所以即使她只问过“goto”,虽然从技术上讲你的答案是正确的,但它不会是“有用的”,因为它没有教最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多