【7006】括号的匹配问题
Time Limit: 10 second
Memory Limit: 2 MB
问题描述
假设算术表达式中可以包含三种括号: 圆括号'('与')',方括号'['和']',花括号'{'及'}',并且这三种括号可以按任何次序嵌套使用。
编写程序,利用栈结构来判断输入的算术表达式中的括号是否全部匹配。
若全部匹配,则输出"GOOD";
若不匹配:
有多余的括号,输出"more bracket" (即多左括号的情况)
缺少括号,输出"lack of bracket" (多右括号的情况)
括号不配对, 输出"bracket dismatch" (左右括号不匹配的情况)
Input
输入算术表达式
Output
输出英文结果
Sample Input1
(22-(18-7))*15
Sample Output1
good
Sample Input2
(22-(18-7)*15
Sample Output2
more bracket
Sample Input3
22-(18-7))*15
Sample Output3
lack of bracket
Sample Input4
22-(18-7]*15
Sample Output4
bracket dismatch
【题解】
匹配问题,可以用一个a[4]数组来解决,不管什么类型,遇到一个左括号就++,遇到一个右括号就--。最后看一下a[i]是不是等于0,如果等于0就是匹配的,最后一种dismatch的情况,可以先找一个a[i] > 0的数,然后另外找一个数j,看一下a[i]+a[j]是不是等于0,如果等于0就说明这两种不同的括号,左括号多的和右括号多的数目相同,但是因为类型不同所以dismatch除去以上情况后,如果a[i]>0则说明左括号多了,a[i] <0 右括号多了。
【代码】
#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
string s1;
int a[4],l;
void input_data()
{
cin >> s1;
memset(a,0,sizeof(a)); //初始化a数组全为0
}
void get_ans()
{
l = s1.size();
for (int i = 0;i <= l-1;i++) //根据括号的类型来递增或递减相应的a[i]值
/*
switch (要判断的字符)
{
case '字符’: //如果要判断的字符是X则执行。。。然后要记得加上break;
。。。。。
break;
case ‘字符’:
break;
}
*/
switch (s1[i])
{
case '(' :
a[1]++;
break;
case ')':
a[1]--;
break;
case '[':
a[2]++;
break;
case ']':
a[2]--;
break;
case '{':
a[3]++;
break;
case '}':
a[3]--;
break;
}
}
void output_ans()
{
int now = 0;
for (int i = 1;i <=3;i++) //先判断dismatch的情况
if (a[i] >0)
now = i;
if ( now != 0)
{
for (int i = now +1;i <=3;i++)
if (a[now]+a[i] == 0)
{
printf("bracket dismatch");
return;
}
}
for (int i = 1;i <= 3;i++) //判断多余括号的问题
if (a[i]!=0)
{
if (a[i] > 0)
{
printf("more bracket");
return;
}
if (a[i] < 0)
{
printf("lack of bracket");
return;
}
}
printf("good");
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}

浙公网安备 33010602011771号