XDOJ 307 括号匹配的检验
***喜欢请点个赞,代码人会超开心的!!!***😊🦄🎈
问题描述
假设一个表达式或一段程序中含有三种括号:圆括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”。试写一个程序判别给定的表达式或程序中所含括号是否正确配对出现。
输入说明
每行为一个含有括号的表达式或一段程序。
输出说明
输出一个right或wrong,表明正确匹配与否。
输入样例
while (m<(a[8]+t) {m=m+1; t=t-1;}
输出样例
wrong
解决思路
- 用栈来解决
- 遇到左括号入栈,遇到右括号则与栈顶元素相比较看是否匹配,如果不匹配说明可能出现了(({)这种情况,则直接判错flag=0,退出循环;如果匹配则出栈,检验下一个元素。
- 如果flag=1且栈为空(top=-1)则说明正确配对,输出right
完整代码
#include<stdio.h>
#include<string.h>
int main()
{
char str[100],stack[100],top;
top=-1;//top=-1表示栈为空,入栈top加一然后入栈,出栈top-1
gets(str);
int i,len,flag=1;
len=strlen(str);//字符串的长度
for(i=0;i<len;i++)
{
if(str[i]=='('||str[i]=='{'||str[i]=='[')//左括号入栈
{
top++;
stack[top]=str[i];
}
if(str[i]==')')
{
if(stack[top]=='(')//右括号匹配
top--;
else//右括号不匹配
{
flag=0;break;
}
}
if(str[i]=='}')
{
if(stack[top]=='{')
top--;
else
{
flag=0;break;
}
}
if(str[i]==']')
{
if(stack[top]=='[')
top--;
else
{
flag=0;break;
}
}
}
if(flag==1&&top==-1)//左右括号都匹配且栈空
printf("right");
else
printf("wrong");
return 0;
}