判断括号格式的过程与栈后进先出的特点吻合。
即一串括号,比如:((({{{}{()}}}))(){}),在处理这段括号时,遇到左括号,入栈,遇到右括号,判断与栈顶括号是否成对,成对则顶部元素出栈。最后栈为空则说明括号格式正确。
/*
* @Descripttion: 栈实现括号格式判断
* @version:
* @Author: Dingyf
* @Date: 2020-10-05 17:16:17
* @LastEditors: Dingyf
* @LastEditTime: 2020-10-05 19:23:51
*/
#include <iostream>
#include <stack>
using namespace std;
char symbol[6] = { '(', '[', '{', ')', ']', '}' };
char lleft[3] = { '(', '[', '{' };
char rright[3] = { ')', ']', '}' };
/**
* 判断是否在symbol集合中,是否是括号
*/
bool isIn(char c)
{
bool flag = false;
for (int i = 0; i < 6; i++) {
if (c == symbol[i])
flag = true;
}
return flag;
}
/**
* 判断是哪一个左括号,不是左括号则返回-1
*/
int getLeftNum(char c)
{
for (int i = 0; i < 3; i++) {
if (c == lleft[i])
return i;
}
return -1;
}
/**
* 判断是哪一个右括号,不是右括号则返回-1
*/
int getRightNum(char c)
{
for (int i = 0; i < 3; i++) {
if (c == rright[i])
return i;
}
return -1;
}
int main()
{
stack<char> need; // 期待的括号作为栈存储
bool isRight = true;
cout << "请输入括号,括号只能是{}()[]6各种一个:" << endl;
char szBuf[30];
for (int i = 0; i < 30; i++) {
szBuf[i] = ' ';
}
if (!cin.getline(szBuf, 30)) {
cout << "超出长度限制30" << endl;
}
for (int i = 0; i < 30; i++) {
if (isIn(szBuf[i])) {
int returnLeft = getLeftNum(szBuf[i]);
int returnRight = getRightNum(szBuf[i]);
cout << "栈的大小:" << need.size() << endl;
cout << "symbol:" << szBuf[i] << endl;
cout << "返回的left和right值:" << returnLeft << " " << returnRight << endl;
// 是左括号则将对应的右括号入栈,作为期待括号
if (returnLeft != -1) {
cout << "入栈" << rright[returnLeft] << endl;
need.push(rright[returnLeft]);
}
// 是右括号,判断期待括号栈是否为空,为空则直接返回错误;
// 非空并且与栈顶括号相同,则说明匹配到了期待值最高的一组括号,顶部元素出栈
else if (returnRight != -1) {
if (need.size() == 0) {
cout << "错误" << endl;
isRight = false;
break;
} else {
if (need.top() == szBuf[i]) {
cout << "出栈" << need.top() << endl;
need.pop();
}
}
}
}
}
cout << ((need.size() == 0 && isRight) ? "括号符合标准" : "括号不符合标准") << endl;
return 0;
}