【基础练习】【栈】【映射】codevs3543 括号匹配题解

本来这是一道水题,结果因为我有些大意,弄了一个小时···引以为戒。

这道题比较特殊的一点是四种括号如果存在嵌套必须按照一定的顺序嵌套。

放代码

//codevs3543 括号匹配
#include<stack>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;

map<char,int> low;
stack<char> s;
int n;
bool ok=true;
char a[256];

int main(){
	freopen("1.txt","r",stdin);
	freopen("2.txt","w",stdout);
	low['<']=1;low['(']=2;low['[']=3;low['{']=4;low['>']=5;low[')']=6;low[']']=7;low['}']=8;//用map处理顺序问题,注意已有类型无法重载运算符;当然也可以函数+矩阵(from 里奥)
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		ok=true;
		scanf("%s",a);//注意没有&
		while (!s.empty()) s.pop();//清空栈
		int len=strlen(a);
		int j=0;
		while (j<len){
			char ch=a[j];
			if ((ch=='<')||(ch=='(')||(ch=='[')||(ch=='{')){
				if ((s.empty())||(low[ch]<=low[s.top()])){//需检验栈是否为空
					s.push(ch);
				}
				else{
					ok=false;
					break;
				}
			}
			else if ((!s.empty())&&(low[s.top()]==low[ch]-4)){
				s.pop();
			}
			else{
				ok=false;
				break;
			}
			j++;
		}
		if (!s.empty()) printf("NO\n");//栈不为空,说明有左边一半括号没有匹配的情况
		else if (ok) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

——总角之宴,言笑晏晏。信誓旦旦,不知其反。

时间: 2024-12-25 20:01:21

【基础练习】【栈】【映射】codevs3543 括号匹配题解的相关文章

leetcode题解:Valid Parentheses(栈的应用-括号匹配)

题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]&

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

[栈和队列]括号匹配

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define INIT_STACK_SIZE 100 5 typedef struct 6 { 7 char * chOperator; 8 int dwtop; 9 }OPND; 10 11 void InitStack(OPND *); 12 char Pop(OPND *); 13 void Push(OPND *,char );

数据结构实验之栈四:括号匹配(栈)

数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出"yes",不匹配输出"no" 示例输入 sin(20+10) {[}] 示例输出 yes no 提示 来源 ma6174

栈应用之括号匹配

栈的使用之括号匹配 Char s[n]是一个字符串数组.Stack是一栈,i是元素对应的下表.设一个char flag[n]数组,用来标记是否匹配,数组中数值是‘l’(左不匹配,即没有找到右括号),‘r’(右不匹配),‘o’匹配成功. 算法描述: (1)遍历该字符串数组. While(遍历){ if遇到‘(’,do stack.push(i)(i 是‘(’对应的数组下表),flag[i]=’o’(不一定就是匹配成功,以后遍历完如果stack还有元素,说明没有左匹配,要改成‘l’:如果没有,则就是

栈应用之 括号匹配问题(Python 版)

栈应用之 括号匹配问题(Python 版) 检查括号是否闭合 循序扫描被检查正文(一个字符)里的一个个字符 检查中跳过无关字符(所有非括号字符都与当前处理无关) 遇到开括号将其压入栈 遇到闭括号时弹出当时的栈顶元素与之匹配 如果匹配成功则继续,发现匹配失败时则以检查失败结束 1 def check_parens(text) : 2 # 括号匹配检查函数,text 是被检查的正文串 3 parens = "(){}[]" 4 open_parens = "({[" 5

jzyzoj 栈——P1148:括号匹配加强版

括号匹配加强版 描述 Description 对于一个由(,),[,]括号组成的字符串,求出其中最长的括号匹配字串. 具体来说,满足如下条件的字符串成为括号匹配的字符串: (1) (),[] 是括号匹配的字符串. (2) 若A是括号匹配的串,则(A)或[A] 是括号匹配的字符串. (3) 若A和B都是括号匹配的字符串,则A+B也是括号匹配的字符串.(这里的+是字符串的加法运算). 例如:(),[],([]),()() 都是括号匹配的字符串,而][,[( ]),(]则不是. 字符串A的子串是指由A

【数据结构】栈的应用 括号匹配

括号配对问题: 假设一个表达式中包含三种类型的括号:(),{ },[],嵌套顺序任意 { [()()] } 1  2 3 4  5  6 7  8 引入"期待的急迫程度"概念,例如当接受第一个括号 { ,则它期待与第8个 } 匹配,然而当接受到第二个 [ 时,此时[最期待和第七个 ] 匹配. #ifndef _MATCH_H_ #define _MATCH_H_ #include<iostream> #include <malloc.h> #include &l

【数据结构】栈的应用——括号匹配问题

括号匹配问题: 给一个字符串,其中包含小括号.中括号.大括号,求该字符串中的括号是否匹配. 例如:()()[]{} 匹配([{()}]) 匹配[](               不匹配[(])              不匹配 利用堆栈的思路:建立一个堆栈,然后遍历字符串,如果是'(','{'.'[',则入栈,否则判断当前字符串和栈顶元素是否是一对括号:要注意的是,需要提前判断栈是否为空,为空的时候取top是违法的的,所以只要为空就入栈,然后执行下一次循环,而且,只要循环过程中出现一次栈顶元素和