使用堆栈识别回文

时间:2014-12-03 03:25:38

标签: c palindrome

我编写了以下代码来检查字符串是否是使用堆栈的回文。只要字符串中有两个相同的连续字符,我就得不到正确的输出。例如,代码确实说exe是回文。但它说ee不是回文。

int is_palindrome(char str[]) {
  int j, top = -1;
  char stk_item, s[30];

  for (j = 0; j < strlen(str); j++)
    s[top++] = str[j];
  for (j = 0; j < strlen(str); j++) {
    stk_item = s[--top];
    if (str[j] != stk_item) return 0; // is not a palindrome
  }

  return 1; // is a palindrome
}

可能是什么问题?

2 个答案:

答案 0 :(得分:4)

您混淆了预增量和后增量运算符。

在C中,x++表示&#34;在此语句后增加x的值&#34;并且++x表示&#34;首先递增x的值然后执行语句。&#34;

以下代码应该有效:

int is_palindrome(char str[]) {
  int j, top = -1;
  char stk_item, s[30];

  for (j = 0; j < strlen(str); j++)
    s[++top] = str[j];
  for (j = 0; j < strlen(str); j++) {
    stk_item = s[top--];
    if (str[j] != stk_item) return 0;
  }

  return 1;
}

答案 1 :(得分:3)

首先,堆栈使用 Last-In First-Out 技术。你插入堆栈的最后一件事是第一件事就是它。

基本上,你可以在堆栈上做两件事,即将一个对象插入堆栈(通常称为 push )并从堆栈中删除一个对象(通常称为弹出)。

在推送技术中,将最低可用空索引分配给给定对象。因此它应该是s[++top] = str[j]。因为您首先增加索引,然后用对象填充它。

在pop技术中,你只需将填充最高的索引减少1.因此它应该是stk_item = s[top--]。因为您首先说删除的对象是top然后减少索引。