括號匹配問題

2021-07-23 07:55:12 字數 1743 閱讀 9806

問題描述:

假設表示式中允許包含兩種括號:圓括號與方括號,其巢狀的順序隨意。如(【】())或【(【】【】)】等為正確的匹配:而【(】)或者(【】()或者()())均為錯誤的匹配。

現要求編寫程式,判斷輸入的一行括號是否是匹配的,如果是匹配的,輸出yes,否則輸出no。

解題思路:

檢驗括號是否是匹配的方法可以用「期待的急迫程度」這個概念來描述。例如考慮蝦類括號序列:

【(【 】【 】) 】

1 2 3 4 5 6 7 8

當計算機接受了第乙個括號後,它期待著與其匹配的第八個括號的出現,然而等來的卻是第二個括號,此時第乙個括號只能靠邊,而迫切等待著與第二個括號匹配的是第七個括號,然而等來的卻是第三個,然後第二個再靠邊。。。。以此類推。

由此可見,這個過程與棧結構類似。所以,在演算法中建立空棧,每次讀入乙個括號,如果是左括號則入棧,否則出棧,最後通過棧的長度來判斷是否匹配。

此次,通過使用兩種棧的結構,鏈棧和順序棧。

**實現

//鏈棧

#include

#include

struct stacknode;

struct linkstack;

struct linkstack * initstack ();

void push(struct linkstack * s,char e);

char pop(struct linkstack *s);

int main()

else

temp=pop(s);

if((temp=='('&&c==')')||(temp=='['&&c==']'))

else

}a:c=getchar();

}if (s->length!=0)//最後鏈棧的長度不為零說明不匹配

if (t==0)

printf("no");

else

printf("yes");

return0;}

struct linkstack * initstack ()

void push(struct linkstack * s,char e)

char pop(struct linkstack *s)

//順序棧

#include

#include

#include

struct stack;

struct stack initstack();

void push(struct stack *s,char e);

char pop(struct stack *s);

int main()

else

else

}c=getchar();

}if (s.base!=s.top)//通過棧的長度來判斷是否匹配

t=0;

if (t==0)

printf("no");

else

printf("yes");

return0;}

struct stack initstack()

void push(struct stack *s,char e)

*s->top++=e;

}char pop(struct stack *s)

括號匹配問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在,有一行括號序列,請你檢查這行括號是否配對。輸入第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no 樣例輸入 3 樣例輸出 no noyes 基本演算法思...

括號匹配問題

假設表示式中包含三種括號 圓括號 方括號和花括號,它們可以相互巢狀,如 等均為正確的格式,而等為不正確的格式。以下為演算法程式 括號匹配問題 include include int main char ch while ch getchar eof count 0 break case if cou...

括號匹配問題

1.題目 給定字串,輸出括號是否匹配,例如,yes no abcd e no a b yes。要求必須用遞迴寫,整個實現不可以出現乙個迴圈語句。2.思路 利用棧解題是可以,但也可以遞迴完成 字母p之前的匹配狀況數用count表示 即count表示p之前左括號的個數 f p,count 如果當前字元p...