DS堆疊 括號匹配

2021-10-10 05:57:04 字數 1954 閱讀 5641

問題 c: ds堆疊--括號匹配

時間限制:

1 sec 記憶體限制:

128 mb

提交:396 解決:

343[提交]

[狀態]

[討論版]

題目描述

處理表示式過程中需要對括號匹配進行檢驗,括號匹配包括三種:

「(」和「)」,「[」和「]」,「」。例如表示式中包含括號如下:()

[()(

)]1234

5678

9101112

從上例可以看出第1和第2個括號匹配,第3和第10個括號匹配,

4和5匹配,6和9匹配,7和8匹配,11和12匹配。

從中可以看到括號巢狀的的情況是比較複雜的,

使用堆疊可以很方便的處理這種括號匹配檢驗,

可以遵循以下規則:

1、 當接收第1個左括號,表示新的一組匹配檢查開始;隨後如果連續接收到左括號,則不斷進堆疊。

2、 當接受第1個右括號,則和最新進棧的左括號進行匹配,表示巢狀中1組括號已經匹配消除

3、 若到最後,括號不能完全匹配,則說明輸入的表示式有錯

建議使用c++自帶的stack物件來實現

stack類使用的參考**

n包含標頭檔案 : #include

n建立乙個堆疊物件s(注意stack是模板類):stack <

char

> s;

//堆疊的資料型別是字元型

n把乙個字元ct壓入堆疊: s.

push

(ct)

;n把棧頂元素彈出:s.

pop();

n獲取棧頂元素,放入變數c2: c2 = s.

top();

n判斷堆疊是否空: s.

empty

(),如果為空則函式返回true,如果不空則返回false

輸入第一行輸入乙個t,表示下面將有t組測試資料。

接下來的t行的每行輸入乙個表示式,表示式只考慮英文半形狀態輸入,無需考慮中文全形輸入

輸出對於每一行的表示式,檢查括號是否匹配,匹配則輸入ok,不匹配則輸出error

樣例輸入

2(a+b)[4

*5+(

-6)]

[5*8

]/sqstack;

void

initstack

(sqstack *s)

void

pushstack

(sqstack *s,

char e)

intpopstack

(sqstack *s)

char

gettop

(sqstack s)

intmain

(void);

scanf

("%s"

, a)

; sqstack s;

initstack

(&s)

;for

(j=0

; j<

strlen

(a); j++)}

elseif(

']'==a[j]

&& s.top!=s.base)

}elseif(

'}'==a[j]

&& s.top!=s.base)

}elseif(

(')'

==a[j]

||'}'

==a[j]

||']'

==a[j]

)&& s.top==s.base)}if

(s.base==s.top)

printf

("ok");

else

printf

("error");

if(i!=t-1)

printf

("\n");

}return0;

}

判斷括號是否匹配 堆疊

1.有效的括號 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示...

堆疊入門 括號匹配問題

堆疊入門 括號匹配問題 時間限制 1 秒 記憶體限制 32 兆 題目描述 在某個字串 長度不超過 100 中有左括號 右括號和大小寫字母 規定 與常見的算數式子一樣 任何乙個左括號都從內到外與在它右邊且距離最近的 右括號匹配。寫乙個程式,找到無法匹配的左括號和右括號,輸出原來字串,並在下一行標出不能...

不用堆疊實現的括號匹配

括號匹配的練習時不時會在習題中遇到。為啥我沒有用堆疊,說白了是沒有把堆疊弄透徹,不太會用。去編寫這個題其實當時是覺得有點沒退路。和公司某developer吹牛,說自己在學習c語言,經常做習題,然後把當時眼前看到的括號匹配問題發給了他,還在那裡吹思路。對方一句用堆疊啊,我有點懵。於是很莽撞地回說可以不...