栈的基本操作及如何判断一个表达式中的左右括号是否匹配
转载于:https://blog.csdn.net/qq_34992845/article/details/70313454 如有侵权,请联系本人删除。
我们都知道,栈(stack)具有后进先出的特点,所以在我们思考一个表达式中的左右括号是否匹配问题时,就自然会想到是不是可以利用栈的特点来判断左右括号是否匹配呢?
主要思路如下:
1.扫描整个表达式;
2.判断当前字符是否为括号(左右括号)
①如果不是,则继续扫描下一个字符;
②如果是,则判断当前操作符是否为左括号
若为左括号—>直接入栈。
如果不是左括号,则说明是右括号,这时应该判断栈是否为空。
若栈为空—> 说明此表达式右括号多于左括号。
若栈不为空—>判断当前操作符是否和栈顶操作符匹配,若不匹配—->说明左右括号不匹配,若匹配—–>则继续判断下一个操作符。
3.最后,判断栈是否为空
①栈不为空—–>说明左括号多于右括号
②栈为空—–>说明括号匹配成功。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<stack>
#include<cassert>
bool IsOperator(char ch)
{
if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}')
{
return true;
}
return false;
}
bool MatchBrackets(char* str)
{
stack<char> s;
assert(str);
//首先扫描字符串,然后判断是否为括号
while (*str != '\0')
{
if (!IsOperator(*str))
{
str++;
continue;
}
if (*str == '(' || *str == '[' || *str == '{')
{
s.push(*str);
str++;
}
else//右括号
{
if (s.empty())
{
cout << "右括号多于左括号" << endl;
return false;
}
if (*str == ')' && s.top() == '(' || *str == ']' && s.top() == '[' || *str == '}' && s.top() == '{')
{
s.pop();
str++;
}
else
{
cout << "左右括号不匹配" << endl;
return false;
}
}
}
if (!s.empty())
{
cout << "左括号多于右括号" << endl;
return false;
}
cout << "左右括号匹配正确" << endl;
return true;
}
void Test()
{
char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确
char b[] = "(()))abc{[]}"; // 右括号多于左括号
char c[] = "(()()abc{[]}"; // 左括号多于右括号
char d[] = "(())abc{[]()}"; // 左右括号匹配正确
cout << MatchBrackets(a) << endl;
cout << MatchBrackets(b) << endl;
cout << MatchBrackets(c) << endl;
cout << MatchBrackets(d) << endl;
}
int main()
{
Test();
return 0;
}
结果如下: