数据结构中,括号匹配问题可以说是一个非常经典的问题。
【问题描述】假设一算术表达式中包括三种括号:圆括号“(”和“)”,方括号“[”和“]”,花括号“{”和“}”,且三种括号可按任意次序嵌套使用,试编写程序判定输入的表达式所含的括号是否正确配对出现(提示:表达式可以存入一个数据元素为字符的顺序表/数组中)。若匹配,则输出“Y”,否则输出“N”以及从左侧第一个不匹配字符的位置(从0开始编号)。【输入形式】含括号的算术表达式
【输出形式】Y?或者N?左侧第一个不匹配字符的位置
【样例输入】3+(44*]5-{6*[7*(45-10)]}])
【样例输出】N6 【样例说明】判断括号是否匹配涉及两方面,括号个数和出现次序的判定
#include<stdio.h> int main() { ?int a[1000]={0}; ?for(int l=0;l<1000;l++) ?{ ? ? ?a[l]=0; ?} ?int i,j,c; ?int m;//第一个偶数出现的位置 ?m=0; ?i=0; ?j=999; ?//储存整数数组 ?do ?{ ? ?scanf("%d",&c); ? ? ?{if(c%2==1) ? ? ? ? a[i++]=c; ? ? ? if(c%2==0) ? ? ? ? a[j--]=c;//这样子做会让第一个偶数放在最后 ? ? ?} ?}while (getchar()==',');
//计算m ?for(i=0;i<1000;i++) ?{ ? ? if(a[i]%2==1||a[i]==0) ? ? ? m++; ?} ?//printf("%d",m); ?//printf("\n");
//改变偶数的位置 int n=m;//储存m原来的值 int x=1000-m; int y=0; int b[x]; //复制偶数数组 for(j=0;j<x;j++) { ? ? b[j]=a[m]; ? ? m++; } for(m=n;m<1000;m++) { ? ? a[m]=b[x-1-y]; ? ? y++; }
//计算非0的个数 int notzero=0; for(j=0;j<1000;j++) { ? ? if(a[j]!=0) ? ? ? ? notzero++; }
j=0; ?for(int k=0;k<1000;k++) ?{ ?if(a[k]==0) ? ? continue; ?else ? ? { ? ? ? ? printf("%d",a[k]); ? ? ? ? if(j<notzero-1) ? ? ? ? { ? ? ? ? ? ? putchar(','); ? ? ? ? ? ? j++; ? ? ? ? } ? ? } ?} ?return 0; }
|