7-10 括号匹配 (10 分)
请编写程序判断一个包含“(”和“)”的括号序列是否匹配。如匹配则输出Match;如不匹配,计算出使该序列变为匹配序列所需添加的最少括号数目(只允许在该序列开始和结尾处添加括号),并输出经添加最少括号后得到的合法匹配序列。
输入格式:
输入为若干行,每行一个字符串,包含不超过105个括号。输入行数不超过10行。
输出格式:
对于输入的每个括号序列输出1行或2行信息。若输入的括号序列匹配,则输出Match。若不匹配,则输出分为2行,第1行为一个整数,表示将该序列变为匹配序列所需添加的最少括号数目,第2行为一个字符串,表示经添加最少括号后得到的合法匹配序列。
输入样例:
(())()
)(
()))((
输出样例:
Match
2
()()
4
((()))(())
AC
#include<bits/stdc++.h>
using namespace std;
int main() {
string a;
while(cin>>a) {//输入这里也要注意一下
stack<char> s;
deque<char> q;
int t=0;
for(int i=0; i<a.length(); i++) {
if(a[i]=='(') {
s.push(a[i]);
q.push_back(a[i]);
} else if(a[i]==')') {
if(!s.empty()&&s.top()=='(') {
//这里要判断一下堆栈是否为空!!!
s.pop();
q.push_back(a[i]);
} else {
q.push_front('(');
q.push_back(a[i]);
t++;
}
}
}
while(!s.empty()) {
s.pop();
q.push_back(')');
t++;
}
if(t==0) {
cout<<"Match\n";
} else {
cout<<t<<endl;
while(!q.empty()) {
cout<<q.front();
q.pop_front();
}
cout<<endl;
}
}
return 0;
}
关于双端队列的知识点
声明deque容器
#include<deque> // 头文件
deque<type> deq; // 声明一个元素类型为type的双端队列que
deque<type> deq(size); // 声明一个类型为type、含有size个默认值初始化元素的的双端队列que
deque<type> deq(size, value); // 声明一个元素类型为type、含有size个value元素的双端队列que
deque<type> deq(mydeque); // deq是mydeque的一个副本
deque<type> deq(first, last); // 使用迭代器first、last范围内的元素初始化deq
deque的常用成员函数
deque<int> deq;
deq[ ]:用来访问双向队列中单个的元素。
deq.front():返回第一个元素的引用。
deq.back():返回最后一个元素的引用。
deq.push_front(x):把元素x插入到双向队列的头部。
deq.pop_front():弹出双向队列的第一个元素。
deq.push_back(x):把元素x插入到双向队列的尾部。
deq.pop_back():弹出双向队列的最后一个元素。
deque的一些特点
支持随机访问,即支持[ ]以及at(),但是性能没有vector好。
可以在内部进行插入和删除操作,但性能不及list。
deque两端都能够快速插入和删除元素,而vector只能在尾端进行。
deque的元素存取和迭代器操作会稍微慢一些,因为deque的内部结构会多一个间接过程。
deque迭代器是特殊的智能指针,而不是一般指针,它需要在不同的区块之间跳转。
deque可以包含更多的元素,其max_size可能更大,因为不止使用一块内存。
deque不支持对容量和内存分配时机的控制。
在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector,因为其内部结构显示不需要复制所有元素。
deque的内存区块不再被使用时,会被释放,deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实际操作版本定义。
deque不提供容量操作:capacity()和reverse(),但是vector可以。
这个也不错。
STL—deque(双端队列)_June·D的博客-CSDN博客
其他方法写的答案
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
string str;
while(cin >> str) {
int left = 0;//记录有几个左括号
int right = 0;//记录有几个右括号
int len = str.size();
for (int i = 0; i < len; i++) {
if (str[i] == '(') {
left++;
} else {
if (left == 0) {
right++;//没有匹配成功,右++
} else {
left--;//匹配成功时,左--
}
}
}
if (left == 0 && right == 0) {
cout << "Match"<<endl;
} else {
cout << right + left << endl;
//给右括号匹配左括号
for(int i = 0; i < right; i++)
cout << '(';
cout << str;
//给左括号匹配右括号
for(int i = 0; i < left; i++)
cout << ')';
cout<<endl;
}
}
return 0;
}