在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
)(rttyy())sss)(
)(rttyy())sss)( ? ?$
C++代码:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
stack<char>s;
char result[101];
char str[101];
while(cin.getline(str,101))
{
int i;
cout<<str<<endl; //Êä³ö½á¹û
for(i=0;str[i]!='\0';i++)
{
if('('==str[i])
{
s.push('(');
result[i]=' ';
}//if
else if(')'==str[i])
{
if(s.empty())
result[i]='?';
else
{
s.pop();
result[i]=' ';
}//else
}//else if
else
result[i]=' '; //ÊÇ×ÖĸµÄ»°£¬´òÓ¡¿Õ¸ñ
}//for
//µ½ÕâÀïÖ»ÊÇÍê³ÉÁ˶ԡ°£©¡±ÓÒÀ¨ºÅµÄÌæ»»
// cout<<result<<endl;
result[i]='\0';
int j=0;
while(!s.empty())
{
i--;
if(str[i]==')')
j++;
if('('==str[i])
{
if(0==j)
{
result[i]='$';
s.pop();
}//if
else
{
j--;
}//else
}//if
}//while
cout<<result<<endl;
}//while
return 1;
}package oj1153;
import java.util.Scanner;
import java.util.Stack;
public class Main{
public static void main(String args[]){
//Vector<Character> s = null;
Stack<Character> s=new Stack<>();
Scanner in=new Scanner(System.in);
char [] result=new char[101];
while(in.hasNext()){
s.clear();
String str=in.nextLine(); //获取输入数据
System.out.println(str);
char temp[]=str.toCharArray();
int i=0;
for(;i<temp.length;i++){
if('('==temp[i]){
s.push('(');
result[i]=' ';
}//if
else if(')'==temp[i]){
if(s.empty()){
result[i]='?';
}//if
else{
s.pop();
result[i]=' ';
}//else
}//else if
else
result[i]=' ';
}//for
int j=0;
while(!(s.empty())){
i--;
if(')'==temp[i])
j++;
if('('==temp[i]){
if(0==j){
result[i]='$';
s.pop();
}
else {
j--;
}
}//if
}//while
System.out.println(result);
}//while
}//main
}//Main原文:http://blog.csdn.net/carvin_zh/article/details/46675607