题目简述:
解析:
题目考察对栈的使用。基本思路检查每个输入的字符,如果是字母或者数字则丢掉不管,如果是括号:左括号就进栈,右括号就检查当前栈顶元素是否是对应的同级别左括号,是就将栈顶元素出栈丢掉,然后接着读入字符;不是就直接报错,说明匹配不成功,说明括号不匹配。
读完字符串后,如果栈为空,说明匹配完成。
重点:
掌握对题目的分析和对栈的使用。
知识点:
(1)对栈的建立和使用;
(2)对字符串的操作;
(3)C++中参数传栈怎么传;
代码:
#include <iostream>
#include<stack>
#include<string>
using namespace std;
void Init_Stack(stack<char>stk)
{
while(!stk.empty())
stk.pop();
}
int Match_Bracket(stack<char>stk,string expr,int len)
{
for(int i=0;i<len;i++)
{
if(expr[i]=='('||expr[i]=='['||expr[i]=='{'||expr[i]==')'||expr[i]==']'||expr[i]=='}')
{
if(expr[i]=='('||expr[i]=='['||expr[i]=='{')
stk.push(expr[i]);
else
{
if(expr[i]==')')
//注意,此处加上不为空且栈顶匹配,不然会出错
if(!stk.empty()&&stk.top()=='(')
stk.pop();
else
return 0;
else if(expr[i]==']')
if(!stk.empty()&&stk.top()=='[')
stk.pop();
else
return 0;
else if(expr[i]=='}')
if(!stk.empty()&&stk.top()=='{')
stk.pop();
else
return 0;
}
}
}
if(stk.empty())
return 1;
else
return 0;
}
int main()
{
string expr;
cin>>expr;
int len=expr.length();
stack<char>stk;
//对栈进行初始化
Init_Stack(stk);
//进行括号匹配
int flag=Match_Bracket(stk,expr,len);
if(flag==1)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
return 0;
}
总结:
题目主要考察对栈的使用和对问题的分析解决能力。同时应该注意,本题目没有考虑优先级问题,即没有考虑小括号一定是大括号内。
对于优先级问题其实也很好解决。只需要每个左括号入栈前,都检查当前栈顶元素优先级是不是大于自己就行了。只检查栈顶元素跟自己比即可,其他的不用管。