完全披露:这是一个任务。我不是在寻找明确的答案,而是在寻找一些指导。
我很难用 C 初始化我的堆栈。具体来说,我似乎无法让它正确地将新元素推送到堆栈上。我知道我的 push/pop/etc 功能是正确的(它们是提供的),但我担心我没有正确看待这个。
这是读取字符串并确定它是否“平衡”的基本尝试(所有括号、大括号和方括号都有伙伴并以正确的顺序出现。)据我所知,这不是我的问题逻辑,我相信语法是正确的,所以我有点不知所措......
这是我的实施尝试:
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;
}