西北农林科技大学2024学年C++面向对象程序设计OJ——T7 动态堆栈类及括号匹配

一.题目描述

动态堆栈类及括号匹配(考察类的构建与应用)

Description

设计一个动态字符堆栈类,要求堆栈可存储的字符数量可动态扩展,在构造函数中使用new进行初始堆栈空间内存分配,在析构函数中采用delete释放内存,堆栈类框架如下所示:

class CStack
{
    char *s;
    int tp;
    int size;
public:
    CStack(int initSize = 5);
    ~CStack();
    bool isEmpty();
    bool isFull();
    void push(char c);
    char pop();
    char top();
};

编码完善上述动态字符堆栈类,基于此堆栈类,判断一个字符串中的括号是否正确匹配。如输入"{[(1+2)/(3+4)*5-3]*2}/3-4",则字符串中的括号匹配,若输入"[(])",则字符串中的括号不匹配。

Input

采用getline(cin, string)读入一个可能包含"()[]{}"三种括号的字符串。

Output

判断输入字符串中的括号是否正确匹配,若正确匹配,输出"Balanced",否则输出"Not balanced"。

二.输入与输出

Sample Input 1 

int main(){int a;cin >> a; if (a==0)cout << "Hello world!" << endl;else cout << "Hello China!" << endl;

Sample Output 1

Not balanced


三.代码

#include <iostream>
#include <string>

using namespace std;

class CStack {
private:
    char *s;
    int tp;
    int size;

public:
    CStack(int initSize = 5) {
        size = initSize;
        s = new char[size];
        tp = -1;
    }

    ~CStack() {
        delete[] s;
    }

    bool isEmpty() {
        return (tp == -1);
    }

    bool isFull() {
        return (tp == size - 1);
    }

    void push(char c) {
        if (!isFull()) {
            tp++;
            s[tp] = c;
        }
    }

    char pop() {
        if (!isEmpty()) {
            char c = s[tp];
            tp--;
            return c;
        }
        return '\0';
    }

    char top() {
        if (!isEmpty()) {
            return s[tp];
        }
        return '\0';
    }
};

bool isBalanced(string str) {
    CStack stack;
    for (int i = 0; i < str.length(); i++) {
        char c = str[i];
        if (c == '(' || c == '[' || c == '{') {
            stack.push(c);
        } else if (c == ')' || c == ']' || c == '}') {
            if (stack.isEmpty()) {
                return false;
            }
            char top = stack.pop();
            if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
                return false;
            }
        }
    }
    return stack.isEmpty();
}

int main() {
    string input;
    getline(cin, input);

    if (isBalanced(input)) {
        cout << "Balanced" << endl;
    } else {
        cout << "Not balanced" << endl;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失忆已成习惯.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值