栈的应用之括号匹配问题

  • 设表达式中包含三种括号:圆括号、花括号和方括号,它们可以互相嵌套。
  • 检验算法中可设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况,另外,如果输入序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的同类型左括号,均属不合法情况。当输入序列和栈同时变为空时,说明所有括号完全匹配。
  • 程序代码如下:
#include<stdio.h>
#include<stdlib.h> 
#define size 10
typedef char StackElemType;
typedef struct
{
 	StackElemType elem[size];
	int top;
}SeqStack;

void  InitStack (SeqStack *S)
{   //构造一个空栈 
 	S->top=-1;
}

int Push(SeqStack * S,StackElemType x)  //顺序栈进栈运算 
{
 	if(S->top==size-1)
 	{
  		return 0;   //栈已满 
 	}
 	S->top++;  //修改栈顶指针 
 	S->elem[S->top]=x;  //x进栈 
 	return 1;
}

int Pop(SeqStack * S,StackElemType * x)  //顺序栈出栈运算
{   //将S栈顶元素弹出,放到x所指向的存储空间中带出 
 	if(S->top==-1)  //栈为空 
 	{
  		return 0;
 	}
 	else
 	{
  		* x=S->elem[S->top];  //栈顶元素赋给x 
  		S->top--;
  		return 1;
 	}
}

int GetTop(SeqStack * S,StackElemType * x)   //顺序栈读栈顶元素
{
 	if(S->top==-1)
 	{
  		return 0;
 	}
 	else
 	{
  		* x=S->elem[S->top];
  		return 1;
 	}
} 

int Match(char ch,char str)  //判断两个括号是否匹配
{
 	if((ch=='['&&str==']')||(ch=='{'&&str=='}')||ch=='('&&str==')')
 	{
  		return 1;
 	}
 	else
 	{
  		return 0;
 	}
}

int IsEmpty(SeqStack * S)  //判空
{
 	if( S->top==-1)
 	{
  		return 1;
 	}
 	else
 	{
  		return 0;
 	}
}

void BracketMatch(char *str)
{
 	SeqStack S;
 	int i;
 	char ch;
 	InitStack(&S);
 	for(i=0;str[i]!='\0';i++)  //对字符串中的字符逐一扫描 
 	{
  		switch(str[i])
  		{
   			case '(':
   			case '[':
   			case '{':
    				Push(&S,str[i]);
    				break;
   			case ')':
  	 		case ']':
   			case '}':
    				if(IsEmpty(&S))
    				{
    	 				printf("\n右括号多余!");
     					return;
    				}
    				else
    				{
     					GetTop(&S,&ch);
     					if(Match(ch,str[i])) //用Match判断两个括号是否匹配 
     					{
      						Pop(&S,&ch);  //已匹配的左括号出栈 
     					}
     					else
    	 				{
      						printf("\n对应的右括号不同类!");
      						return; 
     					}
    				}
  			}
 	}
 	if(IsEmpty(&S))
 	{
 	 	printf("\n括号匹配!"); 
 	}
 	else
 	{
  		printf("\n左括号多余\n");
 	}
}

int main()
{
 	char str[10];
 	printf("请输入字符串:\n");
 	scanf("%s",str);
 	BracketMatch(str);
 	printf("\n");
 	return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值