我尝试实现LIFO和递归以反转char数组,但是它无法正常工作

时间:2018-11-22 11:09:24

标签: c

为什么该程序代码没有提供所需的输出?我尝试使用递归和LIFO概念在此代码中反转字符数组。

 #include<stdio.h>
 void reverse(char a[]);
 int main()
{
char a[] = "NAME";
printf("The original character string is: %s\n",a);
printf("The reversed string is:\n");
reverse(a);
system("pause");
}
void reverse(char a[])
{
static int i = 0;
int j = i;
while (a[i] == '\0')
{
    i++;
    reverse(a);
}
printf("%c", a[j]);
}

3 个答案:

答案 0 :(得分:1)

如果要递归,请不要使用静态变量。递归可以非常简单。以下是您想要的。请仔细研究:

{
  allMarkdownRemark (
    filter: {
      frontmatter: { type: { eq: "folio" } }
    }
  ) {
    edges {
      node {
        frontmatter {
          title
          featured_image
          type
        }
      }
    }
  }
}

答案 1 :(得分:1)

首先,条件应该是:

 a[i]!='\0'

而非

 a[i] == '\0'

第二,应该简单地 if 而不是 while 循环,因为递归将照顾到char数组。

为什么在这个简单的问题上为什么还需要 system()函数?

第三,您不需要 j ,只需在打印时递减i,即可使正确的代码为:

#include<stdio.h>

void reverse(char a[]);

int main()
{
    char a[] = "NAME";
    reverse(a); 
}

void reverse(char a[])
{
    static int i = 0;
    if(a[i]!='\0')
    {
        i++;
        reverse(a);
    }
    printf("%c",a[i--]);
}

答案 2 :(得分:0)

首先,在您的代码中不需要j变量。

第二,您必须使用条件语句 if 代替 while循环。该循环只会一次又一次地迭代递归函数。循环是非常复杂的递归函数。为了您的理解,请用笔和纸仔细地绘制递归函数的功能!!!

第三,条件将是

a[i]!='\0'

不是

a[i]=='\0'

第四,对于打印,使用 i 的减量运算符。 反向功能应如下所示:

void reverse(char a[])
{
    static int i = 0;

    if(a[i]!='\0')
    {
        i++;
        reverse(a);
    }
    printf("%c",a[i--]);
}

要反转字符串,您还可以使用以下代码

#include<stdio.h>
void back_print(void)
{
    char ch;
    if((ch=getchar())!='\n')
        back_print();
    putchar(ch);
}

int main()
{
    printf("Enter a text line :");
    back_print();
}

以上代码称为 backprint 代码。

通过使用 LIFO 方法( Stack ),您可以使用以下代码:

#include<stdio.h>
#define MAX_SIZE 100
int TOP=-1;
int stri[MAX_SIZE];
void push(char item)
{
    stri[++TOP]=item;
}

void pop()
{
    TOP--;
}

char top()
{
    return stri[TOP];
}

int main()
{
    char ch;
    printf("Enter the STRING: ");
    for(int i=0; i<MAX_SIZE; i++)
    {
        scanf("%c",&ch);

        if(ch=='\n')
            break;
        push(ch);
    }
    printf("After reverse the STRING is : ");
    for(int i=0; TOP>-1; i++)
    {
        printf("%c",top());
        pop();
    }
    printf("\n");
}