题目链接
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入格式
一行:表达式
输出格式
一行:“YES” 或“NO”
输入输出样例
输入1
2*(x+y)/(1-x)@
输出1
YES
输入二
(25+x)*(a*(a+b+b)@
输出二
NO
说明与提示
表达式长度小于255,左圆括号少于20个
解题思路
这道题主要采用栈这一基础数据结构来进行求解。
栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
这道题主要考虑的是左括号与右括号的匹配,因为输入的字符数量不确定,所以我用C++的vector容器来存储输入的数据(操作:push_back('char')),然后括号匹配的原理是较后出现的左括号与较先出现的右括号匹配,而栈结构正好是“后进先出”(即后进的元素先出栈)。应用到本题中,假设我们栈里只放入左括号,那么较后出现的左括号会在栈顶(也就是我们在访问栈元素时最先访问到的元素),那么当我们在输入中识别到右括号时,就去栈里访问是否有左括号与之匹配,有就继续访问,没有就说明括号不匹配。
PS:栈这一结构可以自己手敲创建也可以直接使用C++自带的stack容器去实现。
附图:
代码贴这
#include<iostream>
#include<stack>//注意添加容器的头文件
#include<vector>
using namespace std;
int main()
{
char c;
vector<char> v;
stack<char> s;
while(cin>>c)
{
if(c=='@')
{
break;
}
v.push_back(c);
}
//flag来标记是否存在左右括号不匹配的状况,1为目前匹配正常,2为不匹配
int flag=1;
for(int i=0;i<v.size();i++)
{
if(v[i]=='(')
{
s.push('(');
}
if(v[i]==')')
{
if(s.size()==0)
{
flag=0;
break;
}
else if(s.top()=='(')
{
s.pop();
}
}
}
//注意这里是检查栈里是否还有剩余的左括号,如果有说明有多的左括号但没有右括号与之匹配
if(s.size()!=0)
{
flag=0;
}
if(flag==0)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
return 0;
}
有什么不足之处请大家多多指教哦☺