1.题目
给定一个字符串,设计一个算法消除其中成对出现的括号,如果括号不成对,提示异常(error),例如:(1,(2,3),(4,(5,6),7))转化为1,2,3,4,5,6,7;
输入: (1,(2,3),(4,(5,6),7
输出: error
输入: (1,2,(3,4))
输出: 1,2,3,4
2.算法
(1)
遍历原始数组,如果是左括号(“(”),设置括号标志位加1,如果是右括号(“)”),设置括号标志位减一,如果都不是,则把数字放入目的数组。最后通过判断括号标志位是否为0判断原始字符串中的括号是否成对出现。
C++代码
#include<bits/stdc++.h>
using namespace std;
bool Bracket(char* psrc, char *pdst){
if(psrc==NULL){
return false;
}
int bracket_num = 0;
while(*psrc){
if((*psrc)=='('){
bracket_num++; //括号数加1
psrc++; //下一个字符
} else if((*psrc)==')'){
bracket_num--; //括号数减1, 消掉1个
psrc++;
}else{
(*pdst++) = (*psrc++); //存储去除括号的字符串
}
}
*pdst = '\0'; //在目的数组末尾加上结束标志
if(bracket_num!=0){
return false;
}else{
return true;
}
}
int main(){
char *src = "(123(23))";
char *dst = new char[strlen(src)];
if(Bracket(src, dst)){
cout<<dst<<endl;
}
else{
cout<<"括号不是成对出现!"<<endl;
}
return 0;
}
(2)
借助于栈实现功能,如果是左括号(“(”),就把左括号入栈,如果是右括号(“)”),就把左括号出栈,如果都不是,则把数字放入目的数组。最后通过判断栈是否为空判断原始字符串中的括号是否成对出现。
C++代码
#include<bits/stdc++.h>
using namespace std;
bool Bracket(string s){
if(s==""){
cout<<"Error"<<endl;
}
vector<char> ans;
stack<char> stk;
int i = 0, len = s.length();
int bracket_num = 0;
while(i < len){
if(s[i]=='('){
stk.push(s[i]);
i++; //下一个字符
} else if(s[i]==')'){ //遇到右括号
stk.pop(); //括号数减1
i++;
}else{
ans.push_back(s[i++]); //存储去除括号的字符串
}
}
if(!stk.empty()){
cout<<"Error"<<endl;
}else{
for(auto i:ans){
cout<<i;
}
cout<<endl;
}
}
int main(){
string s = "(123(23))";
Bracket(s);
return 0;
}