括号匹配问题

设表达式中包含三种括号:圆括号,方括号和花括号,他们可相互嵌套。如(【{}】(【】))或({【】【()】})等均为正确的格式,而{}【】})},{}【()】或(【】}均为不正确的格式。
算法思想
检验算法中可是设置一个栈,每读入一个括号,若是左括号,则直接入栈。等待相匹配的同类右括号,若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况。另外,如果输入序列以读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的同类左括号,均属不合法的情况。当输入序列和栈同时为空时,说明所有的括号完全匹配。
算法描述

#include<iostream>

using namespace std;

typedef char StackElementType;//栈数据类型

typedef struct StackNode{
  StackElementType data; // 数据
  StackNode *next; //指针
}LinkStackNode,*LinkStack;

//定义一个运算符数组集合
StackElementType Str[]={"{([{()}])}"};//一个含括号的字符串

/*
  {(} 左右括号不匹配  ()}右括号多余
  {() 左括号多余      {([{()}])}括号匹配
*/ 
//初始化栈 
void initStack(LinkStack &top){
  LinkStack p;
  p = (LinkStack)malloc(sizeof(LinkStackNode));//申请一个空间作为头结点
  top = p; //头指针指向头结点
  p->next = NULL; //空栈
}

//操作:进栈
bool push(LinkStack &top,StackElementType data){
    LinkStack p;
	p = (LinkStack)malloc(sizeof(LinkStackNode));//申请一个栈的空间
	if(p == NULL)
      return false; //申请空间失败
	//申请成功
    p->data = data; //在申请的空间中放入一个数据

	p->next = top;// 压栈
	top = p;//top指向栈顶
	return true;
}
//出栈并返回出栈的值
bool pop(LinkStack &top,StackElementType &data){
   LinkStack p;
   p = top; //p为栈顶 
   if(p->next== NULL) //栈为空
	 return false;
   //栈不为空 
   top = p->next;//栈顶往下移一个
   data = p->data;//p就为栈顶 ,要出栈的数据
   free(p);//释放栈顶的空间
   return true;
}
//获取栈顶的元素,不改变原来栈的信息
StackElementType getTop(LinkStack top){

	return top->data;//返回栈顶元素
}
//判段一个栈是否是空栈
bool isEmpty(LinkStack S){
 if(S->next==NULL)//空栈
	 return 1;
 else
	 return 0;
}
//判断两个括号是否匹配
bool match(StackElementType a,StackElementType b){
	switch(a){
	  case '(':if(b==')')return 1;break;
	  case '[':if(b==']')return 1;break;
	  case '{':if(b=='}')return 1;break;
    }
	return 0;
}
//括号匹配算法
void brackMatch(char *str){
  LinkStack S;//定义一个S栈
  int i=0;
  StackElementType ch;
  initStack(S);//初始化栈
  while(str[i]!='\0'){
	 // cout << str[i];
	  switch(str[i]){
	   case '(':
       case '[':
	   case '{':
		     push(S,str[i]);//把左边括号压入栈
			 break;
	   case ')':
       case ']':
	   case '}':
		     if(isEmpty(S)){
				 cout << "右括号多余!";
			     return ;
			 }
			 else { //不是空栈
			    ch = getTop(S);//获取栈顶元素
				if(match(ch,str[i]))//用match判断两个括号是否匹配
			    	pop(S,ch);//已匹配的左括号出栈
				else {
				  cout << "对应的左右括号不同类!" ;
				  return ;
				}
			 }
	    	 break;
		}
	  i++;
	}

  if(isEmpty(S))//看是不是空栈
	  cout << "括号匹配!";
  else
     cout << "左括号多余" ;
}
//main函数,程序的入口地址
void main(){

 brackMatch(Str);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值