基于栈的括号匹配问题

括号匹配问题

  • //栈在括号匹配问题中的应用,假设表达式中允许存在三种括号:方括号和圆括号和花括号,其嵌套顺序任意,即 ({})[{([][])}] 等均为正确格式,[(])([))(()] 均为不正确格式
  • 算法思路:以 ({}) 为例,如果是左括号则入栈,第一个字符 ’ ( '入栈,然后第二个 ’ [ ’ 也入栈 。接下来的第三个字符 ’ ] ’ 就不入栈,直接和栈中的 第二个 a[top] ’ [ ’ 比较,如果匹配 则栈中 a[top] 出栈 ,即top-1; 继续比较下一个字符,循环循环循环。如果一旦遇到右括号,但是 现在的a[top] 和右括号不一样,则匹配失败
  • 算法实现
  • 栈的基本操作 基操
#include <stdio.h>
#include <string.h>

typedef struct node{
int top;
char a[100];
}S;

void InitStack(S *s){
   s->top=0;
}


int Push(S *s,char m){
	if(s->top == 19)
		return -1;
	s->top++;
	s->a[s->top] = m;
	return true;
}

int Pop(S *s){
if(s->top==0)
	return false;
else{
	s->top--;
	return true;
}	
}

char GetTop(S *s){
if(s->top==0)
	return 0;
else{
	return s->a[s->top];
}
}	  

//判断是否为括号 
int panduan(char pd){
   
   if(pd == '(' || pd == ')' || pd == '[' || pd
    == ']' || pd == '{' ||pd == '}')
     return true;
   else
     return false;
}
   
int text(char *str,S *s){
   int i =0;
   int size = strlen(str);//获取字符串长度 
   
   for(;i<size;i++){
   	
   	if(panduan(str[i])){
   		
   		if(str[i] == '(' || str[i] == '[' || str[i] == '{')
   			Push(s,str[i]);//如果字符为左括号 入栈 
   		else{
   			
   			char ch = GetTop(s);//获取栈中字符 
   			if(	ch == '(' && str[i] == ')' ||
               	ch == '[' && str[i] == ']' ||
                   ch == '{' && str[i] == '}')
                   Pop(s);//单个字符匹配成功,则出栈,让栈中top-1与后面字符比较 
               else{
               	printf("括号次序不匹配!\n");
   				return false; 
   			}
   		}
   	}
   }
   if(s->top != 0){ //匹配成功则栈中无字符,top为0 
   	printf("左边括号比右边多!\n"); 
   	return false;
   }
   
   return true; 
}


int main(){
   S *s;
   char str[20];
   printf("请输入:");
   gets(str);
   
   if(str[0] == ']' || str[0] == '}' || str[0] == ')'){
   	printf("输入错误!");//第一个字符输入右括号则必然无法匹配 
   	return 0;
   }
   	
   InitStack(s);//初始化 
   
   if(text(str,s))
   	printf("匹配成功!");
   else
   	printf("匹配失败!");	
   
   return 0; 
}
2020/3/29/18/03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值