2010-12-13 47 views
2

美好的一天! 我们的老师要求我们确定一个单词或一系列数字是否是回文或不使用堆栈。我已经完成了。但我现在想更多地练习,我试图通过删除空格和其他不相关的字符来确定句子是否是回文。(注意:不再是我家庭作业的一部分)我的代码已经工作(希望),但是我发现它凌乱。所以我想改善它。我想删除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(); 
} 
+3

我也建议你停止使用得到()函数。使用fgets()代替,所以如果你输入11个或更多字符,你不会粉碎你的堆栈。 – BatchyX 2010-12-13 13:08:10

回答

2

我喜欢你的态度。

首先,你要做的是嵌套两个基本上是一个逻辑语句。您也正在使用错误的功能来确定字符类型:

if 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。期望值。这也会更有效率。


我正在编写这个答案,当原来的问题显然被删除。

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

+0

对不起删除我以前的问题.. :) – newbie 2010-12-13 13:10:08

+0

@Newbie:不用担心。我已经完成了更新。 – AlastairG 2010-12-13 13:12:48

+0

我已经发布了我的改进代码..谢谢 – newbie 2010-12-13 13:43:05

4

可以使最简单的变化如下:

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

还有一些其他的事情可以做,以整理代码(例如结合if陈述,摆脱了isspace因为!isalpha封面那等等)。

+0

@aix我不能使用continue .. huhuhhu,因为它会跳过temp [n] = word [i]; push(&head,word [i]); i ++; n ++; ?? – newbie 2010-12-13 13:05:45

+0

为什么不只是连接两个'if'语句? – AlastairG 2010-12-13 13:06:47

+0

@aix我也想包括这些数字.. – newbie 2010-12-13 13:06:55

0

对于这样一个短暂的跳跃,重写以消除问题是微不足道的。

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++; 
} 
+0

与前三个人一样的答案,仍然没有连接'if'语句。或者删除冗余测试。 'if(!isalnum(word [i]))'等价于'if'语句,但仍不是最好的整体解决方案。 – AlastairG 2010-12-13 13:15:37

+0

@AlastairG:他问一个具体问题的帮助,我解决了它。如果他想休息,他可以问。 – Puppy 2010-12-13 14:40:26

+0

@DeadMD:她说她想改善她的所有代码,并特意删除“goto”。她还明确表示她是一名学生,即使她只问过“goto”,虽然在技术上你的答案是正确的,但它不会“有用”,因为它没有教导最佳解决方案。 – AlastairG 2010-12-13 14:55:06

1

我只是看了看over..might被误解:

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

    } 
    i++; 

}

+2

更好,但不需要继续,而且'i ++'对于两个部分都是通用的,因此可以将其从'if ... else'语句中删除。同样,'isalnum()'与'isalpha()||相同ISDIGIT()'。 – AlastairG 2010-12-13 13:18:17