题目描述:
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
-
输入:
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
-
)(rttyy())sss)(
样例输出:
-
)(rttyy())sss)( ? ?$
注意:cin.getline(str,100)最多只能输入99个字符! 输出: 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。 样例输入:
代码如下:
#include <stdio.h>
#define N 101
int main(void)
{
char str[N], tag[N];
while (scanf("%s", str) != EOF)
{
int i, j;
for (i=0; str[i]!='\0'; ++i)
{
if (')' == str[i])
{
tag[i] = '?';
}
else if ('(' == str[i])
{
tag[i] = '$';
}
else
{
tag[i] = ' '; /*空格*/
}
}
tag[i] = '\0';
for (i=1; tag[i]!='\0'; ++i)
{
if ('?' == tag[i])
{
for (j=i-1; j>=0; --j)
{
if ('$' == tag[j])
{
break;
}
}
if (j >= 0)
{
tag[j] = tag[i] = ' ';
}
}
}
puts(str);
puts(tag);
}
return 0;
}
数据结构课本(清华严蔚敏版)的括号匹配:
1. 括号匹配的四种可能性:
①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确
2. 算法思想:
1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出;
4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出;
5.字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败;
6.正常结束则括号匹配正确。
1.
#include <stack.h>
int main(void)
{
char str[110];
while(gets(str) != NULL)
{
sqStack s;
initStack(s);
int i;
int flag = 1;
for(i=0; str[i]!='\0'; i++)
{
if( '('==str[i] || '['==str[i] || '{'==str[i] ) /*左括号入栈*/
{
push(s, str[i]);
}
else if( ')' == str[i] )
{
if( 1==stackEmpty(s) || getTop(s)!='(' ) /*当前栈为空或者不匹配*/
{
flag = 0;
break;
}
else
{
pop(s);
}
}
else if( ']' == str[i] )
{
if( 1==stackEmpty(s) || getTop(s)!='[' )
{
flag = 0;
break;
}
else
{
pop(s);
}
}
else if( '}' == str[i] )
{
if( 1==stackEmpty(s) || getTop(s)!='{' )
{
flag = 0;
break;
}
else
{
pop(s);
}
}
}
if( 0 == stackEmpty(s) ) /*当前栈不为空*/
{
flag = 0;
}
if(0 == flag)
{
printf("不匹配\n");
}
else
{
printf("匹配\n");
}
}
return 0;
}
2.STL stack容器
#include <stdio.h>
#include <stack>
using namespace std;
#define N 1000
int main(void)
{
char str[N];
while (gets(str) != NULL)
{
int i;
bool flag = true;
stack<char> st;
for (i=0; str[i]!='\0'; ++i)
{
/*左括号入栈*/
if (str[i]=='(' || str[i]=='[' || str[i]=='{')
{
st.push(str[i]);
}
else if (str[i] == ')') /*右括号时,与栈顶元素比较*/
{
if (st.empty() || st.top()!='(')
{
flag = false;
break;
}
else
{
st.pop();
}
}
else if (str[i] == ']')
{
if (st.empty() || st.top()!='[')
{
flag = false;
break;
}
else
{
st.pop();
}
}
else if (str[i] == '}')
{
if (st.empty() || st.top()!='{')
{
flag = false;
break;
}
else
{
st.pop();
}
}
}
if (!st.empty()) /*当前栈不为空*/
{
flag = false;
}
if (flag)
{
printf("匹配\n");
}
else
{
printf("不匹配\n");
}
}
return false;
}