括号匹配判断

问题:

一个表达式中包含三种括号,( )   [ ]   { },且这三种括号可以按照任意次序嵌套使用。判别括号是否正确配对出现。

例如表达式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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值