使用栈来存放左括号,一旦遇到右括号就弹出,弹出不对应的括号或者遍历完毕后栈非空则为不合法的中缀表达式。
#include<iostream>
using namespace std;
template<class T>
class Stack
{
private:
int top;
T *elements;
int MaxSize;
public:
Stack(int Maxsize);
~Stack(){
delete []elements;
}
int push(const T& x);
int size();
T pop();
T gettop();
void MakeEmpty(){
top=-1;
}
bool empty(){
return top==-1;
}
bool full(){
return top==MaxSize-1;
}
};
template<class T>
int Stack<T>::size()
{
return top+1;
}
template<class T>
Stack<T>::Stack(int Maxsize)
{
top=-1;
elements=new T[MaxSize];
MaxSize=Maxsize;
}
template<class T>
int Stack<T>::push(const T& x)
{
if(!full()){
elements[++top]=x;
return 0;
}
return -1;
}
template<class T>
T Stack<T>::pop()
{
return elements[top--];
}
template<class T>
T Stack<T>::gettop()
{
return elements[top];
}
bool isbracket(char x)
{
if(x=='(' || x==')'||x=='['||x==']'||x=='{'||x=='}')return 1;
else return 0;
}
int main()
{
char s[100];
cin.getline(s,100);
Stack<char> a(20);
for(int i=0;s[i]!='\0';i++)
{
if(!isbracket(s[i]))
{
continue;
}
else
{
switch(s[i]){
case '(':{
a.push(s[i]);
break;
}
case ')':{
if(a.gettop()!='('){
cout<<"NO"<<endl;
return 0;
}
else{
a.pop();
}
break;
}
case '[':{
a.push(s[i]);
break;
}
case ']':{
if(a.gettop()!='['){
cout<<"NO"<<endl;
return 0;
}
else{
a.pop();
}
break;
}
case '{':{
a.push(s[i]);
break;
}
case '}':{
if(a.gettop()!='{'){
cout<<"NO"<<endl;
return 0;
}
else{
a.pop();
}
break;
}
}
}
}
if(a.size()){
cout<<"NO"<<endl;
return 0;
}
else cout<<"YES"<<endl;
}