以下是基于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;
}
操作判断总结
判断类型 | 实现逻辑 | 关键函数 |
---|---|---|
栈空判断 | 检查栈顶指针是否为-1 | isEmpty() |
栈满判断 | 检查指针是否达到数组末端 | 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)空间复杂度。