(三)给定一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,请完成程序里的算法
bool IsBracket(char *exp),借助堆栈,检查该字符串的括号是否成对出现。
括号可以嵌套,即: “({()})” 这种形式,但 “({)” 或者 “({}” 都不符合要求。
#include <iostream>
using namespace std;
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
typedef struct {
ElemType *base;//栈底指针
ElemType *top;
int stacksize;
//栈的定义
//TODO
} SqStack;
Status InitStack(SqStack &S) {
S.base=new ElemType [MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
//栈的初始化
//TODO
}
Status DestroyStack(SqStack &S) {
delete []S.base;
S.stacksize = 0;
S.base = NULL;
S.top = NULL;
return OK;
}
Status Push(SqStack &S, ElemType e) {
if(S.top-S.base==S.stacksize) return ERROR;
*S.top = e;
S.top++;
return OK;
//入栈操作
//TODO
}
Status Pop(SqStack &S, ElemType &e) {
if(S.top==S.base) return ERROR;
--S.top;
e=*S.top;
return OK;
//出栈操作
//TODO
}
Status GetTop(SqStack S, ElemType &e) {
if(S.top == S.base)//说明是空栈
return ERROR;
e = *(S.top-1);
return OK;
}
Status StackTraverse(SqStack S) {
ElemType *t = S.top;
ElemType *b = S.base;
while(t-b) {
cout<<*b<<" ";
b++;
}
cout<<endl;
}
int StackLength(SqStack S) {
int i=0;
SqStack p;
p.top=S.top;
while(p.top!=S.base) {
i++;
p.top=S.top--;
}
return i-1;
//获得栈的长度
//TODO
}
int StackEmpty(SqStack S) {
if(S.top==S.base)
return 1;
else
return 0;
//判断栈是否为空,如果为空返回1,不为空返回0
//TODO
}
int IsBracket(char *exp) {
SqStack S;
int i;
char c;
InitStack(S);
for(i=0;exp[i]!='\0';i++) {
if(exp[i]=='('||exp[i]=='['||exp[i]=='{')
Push(S,exp[i]);
else if(exp[i]==')'||exp[i]==']'||exp[i]=='}') {
if(StackEmpty(S))
return ERROR;
else {
GetTop(S,c);
switch(exp[i]) {
case ')':
if(c!='(')
return ERROR;
break;
case ']':
if(c!='[')
return ERROR;
break;
case '}':
if(c!='{')
return ERROR;
break;
}//switch
Pop(S,c);
}//else
}//if
}//for
if(StackEmpty(S))
return OK;
else
return ERROR;
//判断字符串中的括号是否匹配,成功返回1,失败返回0
//TODO
}
int main() {
char a[100];
cin>>a;
SqStack S;
InitStack(S);
cout<<IsBracket(a)<<endl;
}
运行截图: