C语言--数据结构之栈 实现括号匹配问题

栈基本特点:“后进先出”,好比子弹上膛,最后放入弹夹中的子弹最先被射出,正因为栈有此特性,栈可以解决许多实际问题,例如即将讨论的括号匹配问题。
多说不易,来张图唤醒一下。

子弹上膛示意图

在这里插入图片描述栈的特性类似于子弹上膛后射出的情形,最后装入弹夹的子弹最先射出。

**问题描述:**输入一串字符,判断其中括号是否匹配,括号意外字符被忽视。例如:{ [ ] ( ) },{}[]***999&%90(),( *#&[ { } ] )均为括号相匹配的字符串;而{ [ ] ] () },( ] ] ] )或[ ) ( { { ]均为括号不匹配的字符串。

关于此处的程序使用的顺序栈(数组)来存储数据。

#include<stdio.h>
#include<stdlib.h>
#define MAX 50

typedef struct
{
	char stack[MAX];  /*数组实现栈*/
	int top;    /*栈顶位置下标*/
}SeqStack;

void InitStack(SeqStack *s)    /*初始化栈*/
{
	s->top=-1;
}

int Push(SeqStack *s,char x)    /*进栈*/
{
	if(s->top+1==MAX)
		return 1;
	else 
	{
		s->top++;
    	s->stack[s->top]=x;
	    return 0;
	}
}

int Pop(SeqStack *s,char *ch)  /*出栈*/
{
	if(s->top==-1)
		return 1;
	else
		{
			*ch=s->stack[s->top];
		    s->top--;
			return 0;
	    }
}

int GetTop(SeqStack *s,char *x)    /*读取栈顶元素*/
{
	if(s->top==-1)
		return 1;
	else
	{
		*x=s->stack[s->top];	
		return 0;
	}
}

int IsEmpty(SeqStack *s)    /*判断是否为空栈*/
{
	if(s->top==-1)
		return 1;
	else 
		return 0;
}

int Match(char ch1,char ch2)    /*判断括号是否为同一类型*/
{
	if((ch1=='['&&ch2==']')||(ch1=='{'&&ch2=='}')||(ch1=='('&&ch2==')'))
	return 1;
	else
	return 0;
}
void Smatch(char *str)    /*判断字符串中的括号*/
{
	int i;
	char ch;
	SeqStack s;
	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右括号多余\n\n");
				return;
			}
			else
			{
				GetTop(&s,&ch);
				if(Match(ch,str[i]))    /*Match判断两个括号是否匹配*/
					Pop(&s,&ch);    /*已匹配的左括号出栈*/
				else
				{
					printf("\n对应的左右括号类型不匹配!\n\n");return;    
				}
			}
		}
	}
	if(IsEmpty(&s))
		printf("\n括号匹配\n\n");
	else
	{
		printf("\n左括号多余!\n\n");
	}
}
int main()
{
	char b[50];

	printf("请输入字符:");
	gets(b);
	

	Smatch(b);
	system("pause");
	return 0;
}

此程序综合运用到了关于栈的一些相关操作,对学习栈的小伙伴们有复习巩固的作用。此程序部分出于教材。本小白也是第一次发博客,程序如有不足,还希望读者给予宝贵意见!

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值