括号配对问题
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
测试数据组数少于5组。数据保证S中只含有"[","]","(",")","{","}"六 种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
分析:
1)顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
2)当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
3)若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出;
4)若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出;
5)字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败
;
6)正常结束则括号匹配正确。
代码:
#include<iostream>
#include<vector>
#include<
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
vector vec;
string ch;
vec.push_back(' ');//插入空格,保证vec非空
cin>>ch;
for(int i=0;i<n;i++)
{
vec.push_back(ch[i]);
if(vec.back()-1 == *(vec.end()-2)||vec.back()-2 == *(vec.end()-2))<span style="font-family: 'Microsoft YaHei', simsun, Verdana, Arial, Helvetica, sans-serif;">//倒数第二个和倒数第一个,倒数第三个和倒数第一个比较</span>
//vec.back()最尾元素引用
//vec.end()回传一个Iterator,它指向 vector 最尾端元素的下一个位置
//(请注意:它不是最末元素)
{
vec.pop_back();
vec.pop_back();
//vec.pop_back()删除最尾端元素,容器必须非空
}
}
if(vec.size()==1)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
system("pause");
return 0;
}