完全開示:これは割り当て用です。私は明確な答えを探しているのではなく、少しのガイダンスを探しています。
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;
}