我编写了以下代码来检查字符串是否是使用堆栈的回文。只要字符串中有两个相同的连续字符,我就得不到正确的输出。例如,代码确实说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
}
可能是什么问题?
答案 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
然后减少索引。