1

完全開示:これは割り当て用です。私は明確な答えを探しているのではなく、少しのガイダンスを探しています。

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;
}
4

2 に答える 2

2

この行は、入力行から1、2、または3文字スキップする場合があります。

nextChar(s) == '(') || (nextChar(s) == '{') || (nextChar(s) == '['

最も確実に使用する必要があります:

char ch = nextChar(s);
if( ch == '(' || ch == '{' || c == '[' )
于 2012-11-27T09:13:45.307 に答える
1

sあなたはどこにも増加していないようです。あなたのnextChar機能は何をしますか?推測しかできませんが、戻ってくるよう*sです。その場合は、++s反復ごとにs()をインクリメントする必要があります。とにかくそれ魔法のように(プレーンCでそれを行うための賢明な方法がないため)インクリメントする場合は、反復ごとに1回だけ呼び出して、結果を保存する必要があります。前者だと思います。この場合、たとえば次の文字列の場合: "(())"最初の'('を2回読み取り、0を返します。

更新:ええ、どうやらあなたのnextChar関数グローバルカウンターを使用しているようです。アドバイス2が適用され、反復ごとに1回だけ呼び出します。またはさらに良いことに、そのことを取り除きます。関数の設計方法では、プログラムの存続期間全体で1回だけ効果的に使用でき、その機能全体を(* s?*(s ++):* s)に置き換えることができます。または、*(s ++)だけです(自分で0をチェックしてください)。

于 2012-11-27T09:14:23.217 に答える