C 堆栈实现有问题

C 堆栈实现有问题,c,stack,C,Stack,完全披露:这是一项任务。我不是在寻找明确的答案,而是一点指导。 我很难用C初始化我的堆栈。特别是,我似乎无法让它正确地将新元素推送到堆栈上。我知道我的push/pop/etc功能是正确的(它们是提供的),但我担心我没有正确看待这一点 这是读取字符串并确定其是否“平衡”的基本尝试(所有括号、花括号和方括号都有合作伙伴并以正确的顺序出现)。据我所知,这不是我的逻辑问题,我相信语法是正确的,所以我对想法有些茫然 以下是我在实施方面的尝试: int isBalanced(char* s) { stru

完全披露:这是一项任务。我不是在寻找明确的答案,而是一点指导。

我很难用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;
}

此行可以从输入行中跳过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
循环中的每个过程中使用一个元素,其余元素工作正常。再次感谢。