問題 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語言,經常做習題,然後把當時眼前看到的括號匹配問題發給了他,還在那裡吹思路。對方一句用堆疊啊,我有點懵。於是很莽撞地回說可以不...