一.题目描述
动态堆栈类及括号匹配(考察类的构建与应用)
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;
}