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; }