括号配对问题
-
描述
-
现在,有一行括号序列,请你检查这行括号是否配对。
-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入
-
3 [(]) (]) ([[]()])
样例输出
-
No No
Yes
-
-
#include <iostream> #include <string> using namespace std; int main() { int N; string str1; cin >>N; while(N--) { string str2=""; cin >> str1; char *p,*q; p=&str1[0]; q=&str1[str1.length()-1]; int k=0; while(p<=q) { switch(*p) { case '[': case '(':str2+=*p;break; case ']': { if(str2[str2.length()-1]=='[') { str2.erase(str2.length()-1); k=0; break; } else { k=1; break; } } case ')': { if(str2[str2.length()-1]=='(') { str2.erase(str2.length()-1); k=0; break; } else { k=1; break; } } default:break; } p++; if(k==1) break; } if(0==str2.length()&&k==0) //k=1说明有右括号剩余 cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
刚换C++,一时没想到怎么用栈(其实是数据结构学的还是个半吊子),就写出这么一个玩意
-
不过,很多东西也是第一次用,就当扩充知识了
-
创建一个字符串,遇到左括号就写入,遇到右括号就和字符串的最后一个字符进行判断,如果有与之相匹配的括号,就从字符串最后删去左括号,否则就做个标记(因为我的没有存入右括号,第一次没做标记,没有考虑到右括号有剩余的情况,考虑问题不全面)
-
-
p=&str[0]:str是string字符串,再加上下标则为char型,char*类型的p才能正确访问元素
-
str.length():获取字符串的实际长度,那么再-1指向的就是最后一个字符了
-
str.erase(str.length()-1):删除字符串最后一个元素
-
拓展:
语法:
erase()函数可以:
-
- 删除pos指向的字符, 返回指向下一个字符的迭代器,
- 删除从start到end的所有字符, 返回一个迭代器,指向被删除的最后一个字符的下一个位置
- 删除从index索引开始的num个字符, 返回*this.
参数index 和 num 有默认值, 这意味着erase()可以这样调用:只带有index以删除index后的所有字符,或者不带有任何参数以删除所有字符.
此处使用的是第一个用法,删除了指定位置的字符
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
vector<char> vec;
string ch;
vec.push_back(' ');
cin>>ch;
for(int i=0;i<ch.length();i++)
{
vec.push_back(ch[i]);
if( vec.back()-1 == *(vec.end()-2) || vec.back()-2 == *(vec.end()-2))
{
vec.pop_back();
vec.pop_back();
}
}
if(vec.size()==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
这里用到了容器,push_back()表示在vector尾部插入一个元素
看了好久,才醒悟过来这段代码没有一次性输入完毕在进行判断,而是边输入边判断,在中间做了输出vec.back() - 1,发现输出的是数字,猜测是ASCII码,最后查了ASCII表才略懂判断条件
开方括号[为93,闭方括号]为91,开圆括号(为40,闭圆括号)为41
vec.back()-1 == *(vec.end()-2)
判断圆括号是否匹配,而
vec.back()-2 == *(vec.end()-2)
判断方括号是否匹配
至于
vec.push_back(' ');
的作用,是因为每次需要判断两个元素,在只输入一个元素的时候,程序会炸裂= =在前面补个空
最后,检验猜想,输入数字12、13,字母ab、ac等,都可判断为YES,这说明这个程序的核心其实是判断ASCII值之差,差为1或2时为YES,否则为NO