栈的基本用法就是先进后出,后进先出。
题目
烤烤最近在一家数据公司实习。实习生嘛,被分配到的总是特别枯燥的任务,他的任务是对一串字符(不超过50个字符,可能包括括号、数字、字母、标点符号、空格)进行字符匹配的判断。
要求检查这一串字符中的( ) ,[ ],{ }是否匹配。做了一上午,烤烤眼睛都看花了,所以希望你来帮帮他 !
样例:
sin(20+10) {[}]
输出:
yes
no
思路:
先出现的括号肯定为左括号,可以利用栈,先将出现的左括号入栈,一旦出现右括号,进行判断,如果最后进入栈的左括号与右括号匹配,则将这一对括号移除栈,继续进行下一个右括号判断,直至结束,如果都匹配,此时栈是空的,将栈是否为空的作为最终条件,若是则判断yes,栈不为空为判断为no。
代码
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
bool cmp(char a,char b)
{
return a=='('&&b==')'||a=='{'&&b=='}'||a=='['&&b==']';
}
int main()
{
char a[60];
int i,flag=1;
while(gets(a))
{
stack<char>st;
flag=1;
for(i=0;i<strlen(a);i++)
{
if(a[i]=='('||a[i]=='{'||a[i]=='[')
st.push(a[i]);
else if(a[i]==']'||a[i]==')'||a[i]=='}')
{
if(!st.empty()&&cmp(st.top(),a[i]))
st.pop();
else
{
printf("no\n");
flag=0;
break;
}
}
}
if(flag==1)
{
if(st.empty())
printf("yes\n");
else printf("no\n");
}
}
return 0;
}