基于C++的栈操作判断及对应源码实现,包含栈空/栈满判断、括号匹配验证和操作序列合法性检测

以下是基于C++的栈操作判断及对应源码实现,包含栈空/栈满判断、括号匹配验证和操作序列合法性检测三类典型场景,代码可直接编译运行:

一、基础栈操作判断(数组实现)

#include <iostream>
using namespace std;

const int MAX_SIZE = 5;  // 缩小容量便于测试边界

class ArrayStack {
private:
    int data[MAX_SIZE];
    int top = -1;

public:
    // 栈空判断
    bool isEmpty() {
        return top == -1;  // 栈顶指针为-1时栈空
    }

    // 栈满判断
    bool isFull() {
        return top == MAX_SIZE - 1;  // 指针到达数组末端
    }

    // 入栈操作(含栈满判断)
    void push(int val) {
        if (isFull()) {
            cout << "栈满无法入栈!" << endl;
            return;
        }
        data[++top] = val;  // 指针先移动后存储
    }

    // 出栈操作(含栈空判断)
    int pop() {
        if (isEmpty()) {
            cout << "栈空无法出栈!" << endl;
            return -1;
        }
        return data[top--];  // 先取元素后移动指针
    }

    // 查看栈顶元素
    int peek() {
        if (isEmpty()) return -1;
        return data[top];
    }
};

int main() {
    ArrayStack s;
    s.push(10); s.push(20); s.push(30); 
    s.push(40); s.push(50); s.push(60); // 触发栈满提示
    cout << "弹出元素:" << s.pop() << endl; // 50
    cout << "当前栈顶:" << s.peek() << endl; // 40
    return 0;
}

二、括号匹配判断(应用场景)

#include <stack>
#include <string>

bool bracketMatch(const string& expr) {
    stack<char> s;
    for (char ch : expr) {
        if (ch == '(' || ch == '[' || ch == '{') {
            s.push(ch);  // 左括号入栈
        } else {
            if (s.empty()) return false;  // 栈空说明右括号多余
            char top = s.top();
            if ((ch == ')' && top == '(') || 
                (ch == ']' && top == '[') || 
                (ch == '}' && top == '{')) {
                s.pop();  // 匹配成功则出栈
            } else {
                return false;
            }
        }
    }
    return s.empty();  // 栈空说明全部匹配完成
}

// 测试用例
int main() {
    cout << boolalpha;
    cout << bracketMatch("({[]})") << endl;  // true
    cout << bracketMatch("([)]") << endl;    // false
    return 0;
}

三、操作序列合法性检测

#include <iostream>
using namespace std;

bool isLegalOperation(const string& ops) {
    int pushCount = 0;
    for (char op : ops) {
        if (op == 'I') pushCount++;
        else if (op == 'O' && --pushCount < 0) 
            return false;  // 出栈数超过入栈数
    }
    return pushCount == 0;  // 最终入出栈次数相等
}

int main() {
    cout << isLegalOperation("IOIOIO") << endl;   // true
    cout << isLegalOperation("IIOOO") << endl;    // false
    return 0;
}

操作判断总结

判断类型实现逻辑关键函数
栈空判断检查栈顶指针是否为-1isEmpty()
栈满判断检查指针是否达到数组末端isFull()
入栈合法性先调用isFull()判断push()
出栈合法性先调用isEmpty()判断pop()
括号匹配栈顶元素与当前右括号类型匹配bracketMatch
操作序列确保任何时候出栈次数≤入栈次数isLegalOperation

运行方式:

g++ -std=c++11 stack_demo.cpp -o stack_demo && ./stack_demo

这些实现均遵循栈的LIFO特性,通过前置条件判断保障操作合法性。括号匹配算法时间复杂度为O(n),空间复杂度最坏情况O(n);操作序列检测算法为O(1)空间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Thomas

谢谢您的打赏,我将会更好创作。

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

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

打赏作者

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

抵扣说明:

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

余额充值