括号配对问题
描述
现在,有一行括号序列,请你检查这行括号是否配对
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
算法思路
分析
- 匹配的关键在于括号的两两成功配对后,配对括号然后消失。消失后让外部括号得以成功配对,然后消失,依次类推。
- 利用栈,依次将括号压入栈内,只考虑栈顶括号,和即将进栈的括号。如果栈顶括号与即将进栈的括号匹配,则将栈顶括号推出栈与即将进栈的括号一同丢弃。反之如果不匹配则,将即将进栈的括号压入栈内。
- “(“的ascii 码和”)”相差为1,”[“和”]”相差为2,”{“和”}”相差为2。
- (为40; a为97; 0为48; A为65; [为91; {为123;
如果要匹配的一组括号为
([[]()])
……. | 栈内 | 栈内 | 栈顶 | 即将进栈的括号 | 等待进栈的括号 | |
---|---|---|---|---|---|---|
( | [[] ()]) | 栈顶元素为空,将即将进栈的括号压入栈中 | ||||
( | [ | [] ()]) | 栈顶元素与即将进栈的括号不匹配,将即将进栈的括号压入栈中 | |||
( | [ | [ | ] ()]) | 栈顶元素与即将进栈的括号不匹配,将即将进栈的括号压入栈中 | ||
( | [ | [ | ] | ()]) | 栈顶元素与即将进栈的括号匹配,将即将进栈的括号与栈顶元素舍弃 | |
( | [ | ( | )]) | 栈顶元素与即将进栈的括号不匹配,将即将进栈的括号压如栈中 | ||
( | [ | ( | ) | ]) | 栈顶元素与即将进栈的括号匹配,将即将进栈的括号与栈顶元素舍弃 | |
( | [ | ]) | 栈顶元素与即将进栈的括号不匹配,将即将进栈的括号压入栈中 | |||
( | [ | ] | ) | 栈顶元素与即将进栈的括号匹配,将即将进栈的括号与栈顶元素舍弃 | ||
( | ) | 栈顶元素与即将进栈的括号匹配,将即将进栈的括号与栈顶元素舍弃 | ||||
最终无即将进栈括号,且栈顶为空,说名匹配成功返回yes |
代码展示
这不是我写的代码我写的代码,我写的当初没有保存,现在是引用别人的代码。
#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;
}
这里是我第一次写的代码
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
int main(){
int line;
cin >> line;
getchar();//
for(int i = 0;i < line;++i ){
stack<char> temp;//建立栈
char c = 0;
char topvalue = 0;
while(1){
c = getchar(); //即将入栈的字符
if(c == '\n'){//判断每组括号组是否输入完成
break;
}
if(temp.empty()) {//刚开始时括号为空,直接压栈
temp.push(c);
continue;
}
topvalue = temp.top();//复制栈顶元素
if(c == ']' && topvalue == '[' ){//检测匹配
temp.pop();
continue;
}
if(c == ')' && topvalue == '('){
temp.pop();
continue;
}
temp.push(c);//不匹配,就将待进站栈c,压人栈中
}
//结束后判断栈是否为空
if(temp.empty()){
cout << "Yes\n";
}else{
cout << "No\n";
}
}
}
这是我根据别人写的改进的代码
#include <iostream>
#include <vector>
#include <stdio.h>
#include <string>
using namespace std;
int main(){
int n;
cin >> n;
while(n--){
string str;
cin >> str;
vector<char> ch;
ch.push_back(' ');
for(int i = 0; i < str.length(); ++i){
if(str[i] - 2 == ch.back() || str[i] - 1 == ch.back()){
ch.pop_back();
}else{
ch.push_back(str[i]);
}
}
if(ch.size() == 1){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
}
return 0;
}