问题描述
给定一串字符(以’#’结束,不超过100个字符),可能包括三种括号:小括号、中括号和大括号,各种括号之间允许任意的嵌套,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入格式:
输入一字符串(以’#’结束,不超过100个字符),可能包括三种括号:小括号、中括号和大括号,各种括号之间允许任意的嵌套。
输出格式:
如果括号配对,输出配对成功信息,否则输出配对不成功信息。
2.测试数据
(1) ([]{})
(2) {[}]
(3) {{}
(4) ())
代码内容
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
//dypedef:为一种数据类型定义一个新名字
typedef char SElemType;
typedef char ElemType;
typedef int Status;
//链栈存储结构
typedef struct Node{
ElemType data;
struct Node *next;
}stacknode,*LinkStack;
//链栈初始化
Status InitStack(LinkStack &S){
//构造一个空栈S,栈顶指针置空
S=NULL;
return OK;
}
//链栈入栈
Status Push(LinkStack &S,SElemType &e){
LinkStack p=new stacknode; //生成新节点
p->data=e; //数据域置e
p->next=S; //将新节点插入栈顶
S=p; //修改栈顶指针为p
return OK;
}
//链栈的出栈
Status Pop(LinkStack &S,SElemType &e){
//删除S的栈顶元素,用e返回其值
if(S==NULL) //判断是否为空栈
return ERROR;
LinkStack p=S; //定义新节点,用于临时保存S栈顶元素的空间,以备释放
e=S->data; //将栈顶元素赋值给e
S=S->next; //修改栈顶指针
delete p; //释放原栈顶空间
return OK;
}
//取栈顶元素
SElemType GetTop(LinkStack S){
if(S!=NULL)
return S->data; //返回栈顶元素,栈顶指针不变
}
void Matching(){
LinkStack S;
InitStack(S); //初始化空栈
char ch,x;
cin>>ch; //读取第一个字符
int flag=1,count=1; //用于标记是否匹配成功
//以#结束且不超过100个字符
while(ch!='#'&&flag&&count<=100){
switch(ch){
case '{':
case '[':
case '(': //若是左括号,将其压入栈
Push(S,ch);
break;
//若是右括号,分类型进行匹配
case ')':
if(S!=NULL&&GetTop(S)=='(')
Pop(S,x);
else flag=0;
break;
case ']':
if(S!=NULL&&GetTop(S)=='[')
Pop(S,x);
else flag=0;
break;
case '}':
if(S!=NULL&&GetTop(S)=='{')
Pop(S,x);
else flag=0;
break;
}
cin>>ch; //继续读取下一个字符
count++; //计数器
}
//如果栈空且都能匹配成功,则匹配成功,否则匹配失败
if(S==NULL&&flag)
cout<<"匹配成功"<<endl;
else
cout<<"匹配失败"<<endl;
}
int main(){
Matching(); //主函数调用方法
return 0;
}
测试结果
总结
括号匹配问题主要就是考察对栈的使用,通过入栈和出栈来进行匹配,入栈出栈等操作既可以使用顺序栈也可以使用链栈来实现,我这里使用的是链栈,主要是因为代码量比顺序栈相对少点0.0