一、括号匹配:
1.1 问题描述:
给定一串小括号系列"((())())(()(()))",判断其是否是恰好匹配的。如"(())()"是恰好匹配的,但")()"、"()("、"(()"等不是恰好匹配的。
1.2 问题解决:
用栈结构解决。设栈arr,初始为空,对小括号系列str(1~n):若str(i)为'(',则将str(i)入栈arr,然后判断str(i+1);若str(i)为')'且arr非空,则将arr栈顶元素弹出,然后判断str(i+1);若str(i)为')'且arr为空,则小括号系列str不是恰好匹配;若对str(n)进行判断后栈arr不为空,则小括号系列str不是恰好匹配。
1.3 代码实现:
bool parenthesis_match(char *str){
if(str==NULL||strlen(str)<1){
return true;
}else if(*str==')'){
return false;
}
char *arr=new char[strlen(str)+1];
if(arr==NULL){
exit(0);
}
int i=-1;
arr[++i]=*str++;
while(*str!='\0'){
if(*str=='('){
arr[++i]=*str++;
}else if(i>-1){
--i;
++str;
}else{
break;
}
}
delete[] arr;
if(*str!='\0'||i>-1){
return false;
}else{
return true;
}
}
二、整数处理:
2.1 问题描述:
给定一组互不相等的整数序列,将该整数序列降序输出,且不能出现连续子序列。若连续出现连续子序列,则只输出该连续子序列首尾两个数。如"1 2 3 5 6 7 8 12 11 9 13",则输出为"13 11 9 5 3 1"。
2.2 问题分析:
将整数序列按降序排列,然后在输出是处理连续子序列。
2.3 代码实现:
int discontinuous_integer_sort(char *str,int *arr){
//str:input string
//arr:array to store the final sorted integer
//return value:the sorted integer sequence length
if(str==NULL||arr==NULL||strlen(str)<1){
printf("discontinuous_integer_sort: invalid arguments\n");
return -1;
}
int i,j,k,temp;
i=0,temp=0;
while(true){
if(*str<='9'&&*str>='0'){
temp*=10;
temp+=*str++-'0';
}else{
j=i-1;
while(j>=0){
if(arr[j]<temp){
arr[j+1]=arr[j];
--j;
}else{
break;
}
}
arr[j+1]=temp;
temp=0;
++i;
if(*str++=='\0'){
break;
}
}
}
return i;
}
void print_discontinuous_integer(int *arr,int n){
if(arr==NULL||n<1){
printf("print_discontinuous_integer: invalid arguments\n");
return;
}
printf("%d",arr[0]);
for(int i=1;i<n;++i){
if(arr[i-1]-1==arr[i]&&i+1<n&&arr[i]-1==arr[i+1]){
continue;
}else{
printf(",%d",arr[i]);
}
}
printf("\n");
}
三、测试代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
int discontinuous_integer_sort(char *str,int *arr);
void print_discontinuous_integer(int *arr,int n);
bool parenthesis_match(char *str);
int main(int argc,char *argv[]){
char str1[101];
int arr[101];
int len;
gets(str1);
len=discontinuous_integer_sort(str1,arr);
print_discontinuous_integer(arr,len);
char str2[101];
gets(str2);
if(parenthesis_match(str2)){
printf("Yes\n");
}else{
printf("No\n");
}
return 0;
}