C 堆栈实现有问题
完全披露:这是一项任务。我不是在寻找明确的答案,而是一点指导。 我很难用C初始化我的堆栈。特别是,我似乎无法让它正确地将新元素推送到堆栈上。我知道我的push/pop/etc功能是正确的(它们是提供的),但我担心我没有正确看待这一点 这是读取字符串并确定其是否“平衡”的基本尝试(所有括号、花括号和方括号都有合作伙伴并以正确的顺序出现)。据我所知,这不是我的逻辑问题,我相信语法是正确的,所以我对想法有些茫然 以下是我在实施方面的尝试:C 堆栈实现有问题,c,stack,C,Stack,完全披露:这是一项任务。我不是在寻找明确的答案,而是一点指导。 我很难用C初始化我的堆栈。特别是,我似乎无法让它正确地将新元素推送到堆栈上。我知道我的push/pop/etc功能是正确的(它们是提供的),但我担心我没有正确看待这一点 这是读取字符串并确定其是否“平衡”的基本尝试(所有括号、花括号和方括号都有合作伙伴并以正确的顺序出现)。据我所知,这不是我的逻辑问题,我相信语法是正确的,所以我对想法有些茫然 以下是我在实施方面的尝试: int isBalanced(char* s) { stru
int isBalanced(char* s) {
struct DynArr *string;
string = newDynArr(50);
while (nextChar(s) != '\0') {
if ((nextChar(s) == '(') || (nextChar(s) == '{') || (nextChar(s) == '[')) {
pushDynArr(string, nextChar(s));
}
if (nextChar(s) == ')') {
if (topDynArr(string) != '(') {
return 0;
} else popDynArr(string);
}
if (nextChar(s) == '}') {
if (topDynArr(string) != '{') {
return 0;
} else popDynArr(string);
}
if (nextChar(s) == ']') {
if (topDynArr(string) != '[') {
return 0;
} else popDynArr(string);
}
}
if (isEmptyDynArr(string)) {
printf("The stack is empty\n");
return 1;
} else return 0;
}
输出总是打印“堆栈为空”并返回true,尽管我给出了不平衡的字符串。我可能已经看这个太久了,看不出明显的问题。如果你能提供帮助,我将不胜感激。我不需要明确的答案,但朝着正确的方向努力就足够了
编辑:以下是已请求的函数
int isEmptyDynArr(DynArr *v)
{
if(v->size == 0) {
return 1;
}
else return 0;
}
DynArr* newDynArr(int cap)
{
assert(cap > 0);
DynArr *r = (DynArr *)malloc(sizeof( DynArr));
assert(r != 0);
initDynArr(r,cap);
return r;
}
void pushDynArr(DynArr *v, TYPE val)
{
assert(v != 0);
addDynArr(v, val);
}
void popDynArr(DynArr *v)
{
assert(v != 0);
assert(isEmptyDynArr(v) == 0);
v->size--;
}
TYPE topDynArr(DynArr *v)
{
assert(v != 0);
assert(isEmptyDynArr(v) == 0);
return v->data[v->size - 1];
}
char nextChar(char* s)
{
static int i = -1;
char c;
++i;
c = *(s+i);
if ( c == '\0' )
return '\0';
else
return c;
}
此行可以从输入行中跳过1、2或3个字符:
nextChar(s) == '(') || (nextChar(s) == '{') || (nextChar(s) == '['
您应该非常明确地使用:
char ch = nextChar(s);
if( ch == '(' || ch == '{' || c == '[' )
您似乎没有在任何地方递增
s
。您的nextChar
函数做什么?我只能猜测,但它似乎只会返回*s
。如果是这种情况,您需要在每次迭代后增加s(++s
)。如果它神奇地增加了s(因为在普通C中确实没有一种明智的方法可以做到这一点),那么您应该在每次迭代中只调用它一次并保存结果。我猜是前者,在这种情况下,例如对于这个字符串:“(())”您将读取第一个“(”两次并返回0
更新:是的,显然你的nextChar函数确实使用了一个全局计数器。建议二适用,每次迭代只调用一次。或者更好的是,去掉这个东西。按照函数的设计方式,你可以在整个程序生命周期中有效地使用它一次,而这个东西的整个功能可以用(*s*(s++):*s)。或者只是*(s++),(0)自己检查一下。只是友好提示:在C++中没有变量与保留词/标准类相同的名称。它是有效的,因为这不是C++,但是它更容易移植到C++,或者用C++编译器编译(因为它是严格的类型规则所做的)。.显示
isEmptyDynArr()的代码什么是NeXCHAR?我问是因为你似乎没有在任何地方递增S指针。如果你用NExCHAR来做这件事,这在C中是不可能的,除非你使用某种全局计数器,而不是C++,否则你会遇到麻烦,因为你在确定字符之前连续调用NExtChar多次。如果不是,Y您需要在每次迭代后增加它。您可以显示DynArr
结构吗?以及nextChar
和pushDynArr
/popDynArr
/
/nextChar()
不是幂等函数:每次调用都会移动它在字符串中的读取位置。@lenik谢谢,这就是问题所在。我想我太累了,没有意识到对nextChar()的每次连续调用都是在堆栈中递增的,然后才能对其执行任何操作。添加char ch=nextChar(s)
允许在while
循环中的每个过程中使用一个元素,其余元素工作正常。再次感谢。