数据结构实验之栈四:括号匹配
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入
输入数据有多组,处理到文件结束。
输出
如果匹配就输出“yes”,不匹配输出“no”
示例输入
sin(20+10){[}]
示例输出
yesno
提示
这道题,考察的是对于栈的用法。现阶段,栈对于我而言只是一种思考问题的方法:
先入的后处理,而每进入一个元素(数值)就和他的前一个元素(数值)相比较,并进行一系列的操作。
本题的思路大体上也是如此:先输入一个字符串,再将该字符串中的“(”,“)”,“{”,“}”,“【”,“】”输入另外一个字符数组中。再输入时,如果进入的元素为各种括号的右侧,则对栈中的上一个元素进行判断,如果恰好是其对应的左部,则使该元素(在栈中的)出栈(将其下标减一)。当然若栈中本就没有元素即栈为空(下标为零),同样结束循环。,如果输入的为括号的左半部则继续向下进行。
题目的突破口在于:无论什么括号,一定是从左半部开始,到其右半部结束,故,输入为左半部时,是不需要进行判断的(因为元素并未完全输入,找右半部也是找不到的)。而输入至右半部出现时,就要与其最靠前的一个括号元素相比较(也只能和一个括号的左半部比对),若符合则出栈。一旦无法出栈,就证明这是无法两两成功配对的了,那么,循环宣告结束,标记后退出。
在判断时一方面借助标记元素,另一方面也要通过栈是否为空,只有栈未标记并且栈为空,才可以认为该字符串满足要求
来源
ma6174
示例程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,j,n,l;
char s[150],p[150];
while(gets(s)!=NULL)
{
n=strlen(s);
j=0; //标示符号
l=1;
for(i=0; i<n; i++)
{
if(s[i]=='{'||s[i]=='('||s[i]=='[')
{
p[j++]=s[i];
}
if(s[i]==')')
{
if(j==0)
{
l=0;
break;
}
if(j>0&&p[j-1]=='(') //与上一个元素比较
{
j=j-1;
}
else if(j>0&&p[j-1]!='(')
{
l=0;
break;
}
}
if(s[i]==']')
{
if(j==0)
{
l=0;
break;
}
if(j>0&&p[j-1]=='[')
{
j=j-1;
}
else if(j>0&&p[j-1]!='[')
{
l=0;
break;
}
}
if(s[i]=='}')
{
if(j==0)
{
l=0;
break;
}
if(j>0&&p[j-1]=='{')
{
j=j-1;
}
else if(j>0&&p[j-1]!='{')
{
l=0;
break;
}
}
}
if(l==0||j>0)
printf("no\n");
else if(j==0)
printf("yes\n");
}
return 0;
}