问题:假设一个算法表达式种包含圆括号、方括号、花括号三种类型的括号,编写一个函数,用来判断表达式种的括号是否正确配对。
算法思想:
在算术表达式中,右括号和左括号的匹配次序正好符合后到的括号要最先被匹配的“后进先出”堆栈操作特定,因此可借助栈来操作。遇到左括号就入栈,遇到右括号就看是否匹配,匹配的话出栈并且继续往后进行。
括号匹配有以下四种情况
1.左右括号匹配次序不正确
2.右括号多于左括号
3.左括号多于右括号
4.括号匹配正确
具体方法看代码:
#include<iostream>
#include<cstring>
#include<stack> //可以自己写跟栈相关的函数,为图方便,我用了c++的stack容器
using namespace std;
bool ExpIsCorrect(char* exp) //判断字符串的左右括号是否匹配正确
{
stack<char> myStack;
int n = strlen(exp);
int i = 0;
while (i < n)
{
//exp[i]是止char*的当前字符
if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{')
myStack.push(exp[i]); //左括号全部进栈
/*若当前右括号与栈顶匹配则出栈*/
else if (exp[i] == ')' && !myStack.empty() && myStack.top() == '(')
myStack.pop();
else if (exp[i] == ']' && !myStack.empty() && myStack.top() == '[')
myStack.pop();
else if (exp[i] == '}' && !myStack.empty() && myStack.top() == '{')
myStack.pop();
/*若当前右括号与栈顶不匹配则次序错误*/
else if (exp[i] == ')' && !myStack.empty() && myStack.top() != '(')
{
cout << "括号配对次序错误" << endl;
return false;
}
else if (exp[i] == ']' && !myStack.empty() && myStack.top() != '[')
{
cout << "括号配对次序错误" << endl;
return false;
}
else if (exp[i] == '}' && !myStack.empty() && myStack.top() != '{')
{
cout << "括号配对次序错误" << endl;
return false;
}
/*若当前仍有右括号,而栈已空*/
else if ((exp[i] == '}' || exp[i] == ')' || exp[i] == ']') && myStack.empty())
{
cout << "右括号多于左括号" << endl;
return false;
}
i++;
}
/*若当前以无括号,而栈非空*/
if (!myStack.empty()) {
cout << "左括号多于右括号" << endl;
return false;
}
return true;
}
int main()
{
char s1[] = "(())abc{[(])}";
char s2[] = "(()))abc{[]()}";
char s3[] = "(()()abc{[]}";
char s4[] = "(())abc{[]}";
if (ExpIsCorrect(s1))cout << "左右括号正确配对" << endl;
if (ExpIsCorrect(s2))cout << "左右括号正确配对" << endl;
if (ExpIsCorrect(s3))cout << "左右括号正确配对" << endl;
if (ExpIsCorrect(s4))cout << "左右括号正确配对" << endl;
return 0;
}