括號匹配問題

2021-09-29 18:53:10 字數 1709 閱讀 2232

#第一種

(1):今天來說一下括號匹配問題,首先先來個比較簡單的,只判斷一種括號,像這種:

a: (()()())

b: ()()()()

c: ())(

解決這個問題的思路,我這有兩種,一種是用棧解決,一種是用乙個變數 i 來解決;在這呢,我先用變數 i來解決。

**思路:**我們首先在考慮時,可以用乙個變數來記錄輸入的括號數,給他初始化為零。如果第乙個輸入就是: 『)』,南無我們是不是可以直接判斷他不匹配呢,答案是如果第乙個是』)』,那他就是不匹配的,這就解決了第乙個輸入是』)』的問題。如果第乙個輸入是』(』,則變數 i++;否則 i–;

在這呢就有的人會問如果我的輸入像第三個這樣,這個是不是就判斷不了呢。

好了,既然問題來了咱就解決:既然要判斷的是它批不批配,那也就是說你要判斷 變數 i 在什麼樣的條件下是正確的,我們可以看到當你輸入』)』,變數 i 就要做–, 那麼 i 在什麼樣的情況下不能做 – 呢,顯然變數 i 的值是不能為負值的,所以在判斷出入是』)'時,加乙個 變數 i .如果 i==0,則表示括號肯定是不匹配的,否則就可以做 i–; 這樣問題就解決了。話不多說,咱們來看**:

#include

intmain()

if(ch ==

')'&& i !=0)

i--;

ch =

getchar()

;}if(i ==0)

printf

("yes\n");

else

printf

("no\n");

}

##第二種就是判斷的括號種類較多的,當然這種也可以用變數的方法實現。但在這,我用棧的方法實現:

思路:我們知道第一次出現右括號必須與相鄰的左括號是一定要是匹配的,它才能使匹配的否則不是,所以有以下思路:當遇到左括號入: 】 )時,取棧頂元素與之比較,如果匹配出棧,再衣次往下判斷,直到字元輸完。這之後判斷棧是否為空,若為空,則它是匹配的,否則不是匹配的。

**:

#include

#include

#define max 100

typedef

struct

seqstack;

void

initstack

(seqstack *s)

intisempty

(seqstack *s)

intpush

(seqstack *s,

char x)

}int

pop(seqstack *s,

char

*x)}

intgettop

(seqstack *s,

char

*x)}

intmatch

(char x,

char y)

intmatchstack

(char

* str)':

if(!isempty

(s))

else}}

}if(isempty

(s))

printf

("yes\n");

else

return0;

}int

main()

}

有寫的不周到的地方,請大家指出來。

括號匹配問題

時間限制 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...

括號匹配問題

問題描述 假設表示式中允許包含兩種括號 圓括號與方括號,其巢狀的順序隨意。如 或 等為正確的匹配 而 或者 或者 均為錯誤的匹配。現要求編寫程式,判斷輸入的一行括號是否是匹配的,如果是匹配的,輸出yes,否則輸出no。解題思路 檢驗括號是否是匹配的方法可以用 期待的急迫程度 這個概念來描述。例如考慮...