信息學奧賽一本通1355 字符串匹配問題(strs) (棧)

1355:字符串匹配問題(strs)


時間限制: 1000 ms         內存限制: 65536 KB
提交數: 11150     通過數: 3866

【題目描述】

字符串中只含有括號 (),[],<>,{},判斷輸入的字符串中括號是否匹配。如果括號有互相包含的形式,從內到外必須是<>,(),[],{},例如。輸入: [()] 輸出:YES,而輸入([]),([)]都應該輸出NO

【輸入】

第一行爲一個整數n,表示以下有多少個由括好組成的字符串。接下來的nn行,每行都是一個由括號組成的長度不超過255255的字符串。

【輸出】

在輸出文件中有n行,每行都是YESNO

【輸入樣例】

5
{}{}<><>()()[][]
{
  
  {}}{
  
  {}}<<>><<>>(())(())[[]][[]]
{
  
  {}}{
  
  {}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{
  
  {[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

【輸出樣例】

YES
YES
YES
YES
NO

與一本通1354題類似,

1. 左括號:

遇到 < 直接將其入棧,

遇到 ( 判斷棧是否爲空,

        棧爲空判斷棧頂元素是否爲 < ;是 < 則括號不匹配;修改標記cnt爲false;不是 < 則將 ( 入棧;

        棧不爲空則將 ( 入棧;

遇到 [ 判斷棧是否爲空,

        棧爲空判斷棧頂元素是否爲 < 或 ( ;是 < 或 ( 則括號不匹配;修改標記cnt爲false;不是 < 或 ( 則將 [ 入棧;

        棧不爲空則將 [ 入棧;

遇到 { 判斷棧是否爲空,

        棧爲空判斷棧頂元素是否爲 < , ( 或 [ ;是 < , ( 或 [ 則括號不匹配;修改標記cnt爲false;不是 < , ( 或 [ 則將 { 入棧;

        棧不爲空則將 { 入棧;

2. 右括號:

遇到 > 判斷棧是否爲空,

        棧不爲空判斷棧頂元素是否爲 < ;是 < 則此括號匹配;彈出棧頂元素;不是 < 則不匹配;修改標記cnt爲false;

        棧爲空則不匹配,將 cnt 修改爲false;

遇到 ) 判斷棧是否爲空,

        棧不爲空判斷棧頂元素是否爲 ( ;是 ( 則此括號匹配;彈出棧頂元素;不是 ( 則不匹配;修改標記cnt爲false;

        棧爲空則不匹配,將 cnt 修改爲false;

遇到 ] 判斷棧是否爲空,

        棧不爲空判斷棧頂元素是否爲 [ ;是 [ 則此括號匹配;彈出棧頂元素;不是 [ 則不匹配;修改標記cnt爲false;

        棧爲空則不匹配,將 cnt 修改爲false;

遇到 } 判斷棧是否爲空,

        棧不爲空判斷棧頂元素是否爲 { ;是 { 則此括號匹配;彈出棧頂元素;不是 { 則不匹配;修改標記cnt爲false;

        棧爲空則不匹配,將 cnt 修改爲false;

最終只需判斷棧爲空且cnt爲true便輸出YES

否則輸出NO

#include <iostream>
#include <stack>
#include <cstdio>
#include <string>
using namespace std;

stack <char> s;

int main()
{
	string str;
	int n;
	int len;
	bool cnt;
	cin >> n;
	getchar();
	while (n --) {
		cin >> str;
		while (!s.empty()) s.pop();
		cnt = true;
		len = str.length();
		for (int i = 0; i < len; i ++) {
			if (str[i] == '<') {
				s.push(str[i]);
			}
			else if (str[i] == '(') {
				if (!s.empty()) { 
					if (s.top() == '<') {
						cnt = false;
						break;
					}
				}
				s.push(str[i]);
			}
			else if (str[i] == '[') {
				if (!s.empty()) { 
					if (s.top() == '(' || s.top() == '<') {
						cnt = false;
						break;
					}
				} 
				s.push(str[i]); 
			}
			else if (str[i] == '{') {
				if (!s.empty()) { 
					if (s.top() == '[' || s.top() == '(' || s.top() == '<') {
						cnt = false;
						break;
					}
				} 
				s.push(str[i]); 
			}
			else if (str[i] == '>') {
				if (!s.empty()) {
					if (s.top() == '<') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				} 
				else {
					cnt = false;
					break;
				}
			}
			else if (str[i] == ')') { 
				if (!s.empty()) {
					if (s.top() == '(') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				}
				else {
					cnt = false;
					break;
				}
				
			}
			else if (str[i] == ']') { 
				if (!s.empty()) {
					if (s.top() == '[') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				}
				else {
					cnt = false;
					break;
				}
			}
			else if (str[i] == '}') { 
				if (!s.empty()) {
					if (s.top() == '{') {
						s.pop();
					}
					else {
						cnt = false;
						break;
					}
				}
				else {
					cnt = false;
					break;
				}
			}
		}
		if (s.empty() && cnt) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}
/*
5
{}{}<><>()()[][]
{
  
  {}}{
  
  {}}<<>><<>>(())(())[[]][[]]
{
  
  {}}{
  
  {}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{
  
  {[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
*/

還可用字符組來模擬棧

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章