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

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

/*
 * @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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值