完全披露:這是用於轉讓的。我不是在尋找明確的答案,而是尋求一點指導。在執行堆棧時遇到問題
我很難用C初始化我的堆棧。具體來說,我似乎無法得到它來正確地將新元素推入堆棧。我知道我的推/流行/等功能是正確的(他們提供了),但我擔心我沒有正確看待這個。
這是讀取字符串並確定它是否「平衡」的基本嘗試(所有圓括號,捲曲和方括號都有合作伙伴並以正確順序出現)。據我所知,它不是我的邏輯有問題,我相信語法是正確的,所以我在對思想的損失是一種...
這是我在嘗試執行:
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;
}
只是一個友好的提示:在C++中,變量與保留字/標準類具有相同的名稱,因爲它不是C++,但它可以更容易地移植到C++或com用C++編譯器編譯(由於更嚴格的類型規則而被視爲完成)。 –
顯示'isEmptyDynArr()'的代碼 – Omkant
nextChar做什麼?我在問,因爲你似乎沒有在任何地方遞增指針。如果你這樣做有nextChar - 這是不可能在C,除非你使用某種形式的全球反的,但不是在C++ - 你會碰上麻煩,因爲你確定字符之前調用nextChar多次在一排。如果沒有,你需要在每次迭代後增加它。 – Cubic