括号的匹配用到了栈的初始化,压栈,弹栈,栈顶元素的获取,和栈是否为空,这里就不写了,我们也可以使用stl中的stack来定义一个栈,,,
算法步骤:
1.初始化一个空栈
2.定义一个flag标记,用以判断括号是否匹配,初始化的时侯将flag标记设为1,当括号不匹配时,flag变为0
3.用循环语句,首先遇到'(','[','{'时,将字符压入栈中,若遇到')',']','}'时,栈顶没有与之匹配的左括号,就将flag变为0,若有与之匹配的左括号,就弹栈
4.最后用判断语句,若栈为空且flag标记依然为1,返回true,否则返回false
程序:
#include <iostream> #include <stack> #include <cstdio> using namespace std; //将左括号压入栈中 void Left(char ch, stack <char> &s) { switch(ch) { case '(': case '[': case '{': s.push(ch); break; default: break; } } //右括号匹配成功弹出栈顶元素 void Right(char ch, stack <char> &s, int &flag) { switch(ch) { case ')': if(s.top() == '(') s.pop(); else flag = 0; break; case ']': if(s.top() == '[') s.pop(); else flag = 0; break; case '}': if(s.top() == '{') s.pop(); else flag = 0; break; default : break; } } //匹配 int match(char *a) { int flag = 1; stack <char> s; //初始化一个空栈 while(*a) { Left(*a, s); Right(*a, s, flag); a++; } if(s.empty() && flag) return 1; else return 0; } int main() { char a[100]; gets(a); //读入表达式 if(match(a)) //判断表达式是否匹配 cout << "YES" << endl; else cout << "NO" << endl; return 0; }