首页 > 编程知识 正文

括号匹配问题Java(递归的定义)

时间:2023-05-03 16:38:03 阅读:77109 作者:579

【问题的说明】

字符串(长度不超过100 )中有左括号、右括号、大小写。 (与常见算术表达式一样,规定任何左括号从内到外匹配其右侧且距离最近的右括号。 编写一个程序,找出不匹配的左括号和右括号,输出原始字符串,并在下一行显示不匹配的括号。 不能匹配的右括号是“$“标记,不能匹配的右括号是”?” 标志。

【输入】

输入多组数据。 每组数据为一行,包含一个字符串,只包含左括号、右括号和大小写,字符串长度不超过100

注: CIN.Getline(str,100 )最多可包含99个字符。

【输出】

对于各组输出数据,第一行包含原始输入字符,第二行包含“$”,“?” 输出包含的两行时由空格组成,表示各自对应的左括号和右括号不匹配。

例如:

这里提供三种想法

对每个递归层次结构扫描其馀字符串,如果遇到左括号,并有用于下一个递归的右括号,则标记空格,并返回右括号下一个位置的后缀。 否则,将左括号标记为匹配失败。

# include bits/stdc.husingnamespacestd; char c[300]; int len; intfun(intpos ) { int i; i=pos 1; //从当前位置的下一个位置开始while(1) {while ) c[I]!='(' c[i]!=' ) ' c[i]!=' ' )//当前位置为括号或结束符号{ i; (if ) c[I]==' () ) /由内而外的判断) I=fun ) I ); //递归到下一层(else ) if(c[I]==' ) ) ) ) ) ) )//配对成功的左括号是//配对成功的右括号将当前位置代入空间return i 1; //结束一阶递归,从下一个位置继续查找与一阶左括号对应的右括号}到} else//行末左括号也配对不成功{ c[pos]='$ '; //左括号标记未成功配对的返回len; //结束判定,返回字符串长度,在下面输入while循环} } }}int main () while(CIN.Getline(c,120 ) ) /整行) { coutcendl。 //首先将原始字符串输出到len=strlen(c ); int i重新分配值给c以存储原始字符串中下一行的输出; for(I=0; i len; I (不在//括号中的位置加上空格(if ) c[I]!='(' c[i]!=') ' ) { c[i]=' '; } } i=0; while(c[I]!=' ' ) {while(c[I]!='(' c[i]!=' ' ) { i; }if(c[I]==' () ) /对于左括号,进入递归并查找是否有相应的右括号(I=fun ) I )。 } } i=0; while(c[I]!=' ' () if(c[I]==' ) ) ) /如果还有未配对的右括号,请单击'? { c[i]='?' ; (I; } cout c endl; //重新输出重新赋值的字符数组} return 0; )递归思路)从左向右计数左括号和右括号的个数,左括号的个数记录在变量l中,右括号的个数记录在变量r中; 中了一个左括号的话l加1,中了一个右括号的话r减1。 这样统计的结果,如果l大于0,则表示存在不一致的左括号,如果r小于0,则表示存在不一致的括号。

# include iostream # include bits/stdc.h using

namespace std;int leftcount=0,rightcount=0;char a[105];void panduan(char str[105],int q,int len){ if(q==len) { return; } else if(str[q]=='(') { leftcount++; panduan (str,q+1,len); if(rightcount < 0) { a[q]=' '; rightcount++; } else { a[q]='$'; } } else if(str[q]==')') { if(leftcount > 0) { a[q]=' '; leftcount--; } else { a[q]='?'; } panduan(str,q+1,len); rightcount--; } else { panduan(str,q+1,len); a[q]=' '; }}int main(){ char str[105]; while(cin.getline(str,100)) { cout<<str<<endl; int len = strlen(str); panduan(str,0,len); cout <<a<<endl; leftcount =0; rightcount =0; } return 0;}

③非递归思路:将字符存入数组后,进行判断若第i项为“)”,则二层循环从i开始倒序循环,若为“(”,则将两者的值赋为“ ”;若没有“(”,则没有匹配的右括号。若第i项既不是左括号也不是右括号,将其值直接赋为“ ”。再次循环,若第i项为不能匹配的左括号输出"$",为不能匹配的右括号输出"?",即为结果。

#include <iostream>#include <bits/stdc++.h>using namespace std;int main(){ char str[105]; while(cin.getline(str,100)) { cout<<str<<endl; int len = strlen(str); for(int i=0; i<len; i++) { if(str[i]==')') { for(int j=i-1; j>=0; j--) { if(str[j]=='(') { str[i]=' '; str[j]=' '; break; } } } else if((str[i]!='(')&&(str[i]!=')')) { str[i]=' '; } } for(int i=0; i<len; i++) { if(str[i]=='(') { str[i]='$'; } else if(str[i]==')') { str[i]='?'; } } cout<<str<<endl; } return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。