【数据结构】栈实现括号判断

    科技2022-08-21  119

    判断括号格式的过程与栈后进先出的特点吻合。 即一串括号,比如:((({{{}{()}}}))(){}),在处理这段括号时,遇到左括号,入栈,遇到右括号,判断与栈顶括号是否成对,成对则顶部元素出栈。最后栈为空则说明括号格式正确。

    /* * @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; }
    Processed: 0.019, SQL: 9