问题:
一个表达式中包含三种括号,( ) [ ] { },且这三种括号可以按照任意次序嵌套使用。判别括号是否正确配对出现。
例如表达式1+{2*[4/(2-1)]}中括号是成对出现的。
核心算法思想:
(1)扫描表达式,
(2)如果是左括号则入栈,继续扫描
(3)如果是右括号则 弹出栈顶括号 与当前右括号判断是否匹配;若匹配则继续扫描,否则返回匹配不正确,不再扫描;
(4)扫描完成后若栈为空则正确配对,否则不正确。
流程图:
代码:
#include <iostream>
using namespace std;
#include <string>
class MyStack {
public:
MyStack(int len);
~MyStack();
//入栈
void push(char c);
//出栈
char pop();
//获取当前栈里的元素个数
int getDataNum();
private:
char* buffer = NULL;//缓冲区, 用于存储数据
int len;//缓冲区长度
int headPtr;//栈顶指针
};
//初始化栈
MyStack::MyStack(int len) {
//修改栈的缓冲区的长度记录
this->len = len;
//按照给定长度开辟缓冲区空间
//释放该空间: delete [] buffer;
this->buffer = new char[len];
//初始化栈顶指针
this->headPtr = -1;
}
//销毁栈
MyStack::~MyStack() {
//释放申请的缓冲区空间
delete[] this->buffer;
}
//入栈
void MyStack::push(char c) {
this->headPtr += 1;//指针后移
//检查缓冲区是否有剩余空间
if (this->headPtr >= this->len) {
//缓冲区长度有限, 存储已经满了
string msg = "buffer len:" + to_string(this->len) + ", dataNum:" + to_string(this->headPtr);
throw runtime_error(msg);
}
//将数据存储
this->buffer[this->headPtr] = c;
}
//出栈
char MyStack::pop() {
//检查栈里面是否有数据
if (this->headPtr == -1) {
//缓冲区里面没有数据
string msg = "There is no data in buffer. DataNum:" + to_string(this->headPtr);
//cout << "我在这里4" << endl;
throw runtime_error(msg);
}
//出栈
char temp = this->buffer[this->headPtr];
this->headPtr -= 1;//指针前移
return temp;
}
//获取当前栈里的元素个数
int MyStack::getDataNum() {
return this->headPtr + 1;
}
int main() {
try {
//括号匹配判断
//初始化一个栈, 缓冲区大小为30
MyStack stack(30);
//输入带括号的表达式
string input_str;
cout << "Please input the expression including brackets:" << endl;
cin >> input_str;
//开始循环处理表达式
for (int i = 0; i < input_str.length(); ++i) {
//如果是左括号则入栈,继续扫描
if (input_str[i] == '{' || input_str[i] == '[' || input_str[i] == '(') {
stack.push(input_str[i]);
continue;
}
else if (input_str[i] == '}' || input_str[i] == ']' || input_str[i] == ')') {
//如果是右括号, 弹出栈顶括号, 与当前右括号判断是否匹配
char temp = stack.pop();
if ((temp == '(' && input_str[i] == ')') ||
(temp == '[' && input_str[i] == ']') ||
(temp == '{' && input_str[i] == '}')
) {
//若匹配则继续扫描
continue;
}
else {
//返回匹配不正确, 不再扫描
cout << "在该表达式中括号没有配对出现" << endl;
return 0;
}
}
}//end for
//扫描完成后若栈为空则正确配对,否则不正确
if (stack.getDataNum() != 0) {
cout << "在该表达式中括号没有配对出现" << endl;
}
else {
cout << "在该表达式中括号成对出现" << endl;
}
}//end try
catch (runtime_error& e) {
cout << e.what() << endl;
}
return 0;
}