3 条题解
-
3
发现唯一一个老哥的题解还是py
是时候展示真正的技术了!
已AC,放心食用
#include<iostream> #include<stack> using namespace std; bool left(char s) { return s=='(' || s=='{' || s=='['; } bool right(char s) { return s==')' || s=='}' || s==']'; } bool check(char a,char b) { return (a=='(' && b==')') || (a=='{' && b=='}') || (a=='[' && b==']'); } bool match(string s) { stack<char> p; for(unsigned int i=0; i<s.size(); i++) { if(left(s[i])) { p.push(s[i]); }else if(right(s[i])) { if(!p.empty() && check(p.top(),s[i])) { //栈不空,且匹配正确 p.pop(); } else { return false; //不匹配,直接返回false } } } if(!p.empty()) return false; //栈不空,说明存在没有匹配的左括号,返回false return true; //全都匹配成功 } int main(){ string s; cin >> s; if (match(s)){ cout << "yes"; }else{ cout << "no"; } return 0; }
-
0
栈的基础应用
#include <bits/stdc++.h> using namespace std; string t;//t字符串存储括号 stack<char>s;//栈,char类型 string::iterator it;//这个是迭代器的定义,知道STL的都知道 /* STL小知识->迭代器 迭代器有3种--随机迭代器,双向迭代器,没有迭代器 随机迭代器:迭代器可以比大小,还能使用下标 双向迭代器:不能比大小,只能用迭代器 没有迭代器:迭代器都不能用 迭代器定义:STL<type>::iterator it; 反向迭代器定义:STL<type>::reverse_iterator it; STL迭代器:begin(),end(); STL反向迭代器:rbegin(),rend() ------------------------------------- STL容器&&迭代器 vector(动态数组)随机迭代器 deque(双向队列)随机迭代器 string(字符串)随机迭代器 list(链表)双向迭代器 set(集合)双向迭代器 map(映射)双向迭代器 stack(栈)没有迭代器 queue(队列)没有迭代器 priority_queue(优先队列)没有迭代器 -------------------------------------- 迭代器遍历 正向:for(it=s.begin();it!=s.rend();it++)cout<<*it<<" "; 反向:for(it=s.rbegin();it!=s.end();it++)cout<<*it<<" "; ---------------------------------------- 附赠迭代器遍历 for(auto b:s) */ int main(){ cin>>t;//输入字符串 s.push('#');//为了保证栈不为空 for (it=t.begin();it<t.end();it++){//迭代器正向遍历 if (*it=='('||*it=='[')s.push(*it);//如果是左括号,括号入栈 else{//是右括号 //判断是否有匹配左括号,有弹出栈顶括号,没有,输出no if (*it==')'&&s.top()=='('||*it==']'&&s.top()=='[')s.pop(); else { cout<<"no"; return 0; } } } if(s.size()==1)cout<<"yes";//输出 else cout<<"no"; return 0; }
-
0
嗨嗨嗨,我又来了! 今天咱们聊聊括号匹配。说来惭愧,当年哥在比赛时遇到过这题,可惜当时不得其法,一分未得。现在我才发现,只因我当时不知道stack(栈)。
栈的定义
什么是栈?打个比方,假如你买了一筒乒乓球,这一筒乒乓球就可以看作栈。用时会打开筒口取。你取出的第一个球,是最后放进去的。而这个过程就叫出栈。同理,把乒乓球装入筒叫入栈。栈(stack)就是一种后进先出的数据结构。即最后一个进去的数据会在第一个被取出。
思路
这题的思路很简单,就是遇左入栈,遇右判断。意思就是说把左括号('(''[')入栈,碰到右括号就去栈顶(尾部)寻找左括号。一旦配对,左括号就没用了,移出去。最后判断栈是否为空,为空就成功了,否则配对失败。
代码(Python)
想不到吧,这题我用的是Python(^_^)!
A=list(input()) zero_stack=[] q=0#记录stack的长度 for i in A: if i == '(' or i =='[':#遇左入栈 zero_stack.append(i) q+=1 else: if (zero_stack[q-1] == '[' and i == ']') or (zero_stack[q-1] == '(' and i == ')'):#遇右判断 zero_stack.pop()#作用:删除索引对应的数,默认删除最后一个。 q-=1 if q:#q≠0为true print('no')#配对失败 else:#反之配对成功 print('yes')
Loading:22/100……
- 1
信息
- ID
- 483
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 71
- 已通过
- 49
- 上传者