数据结构与算法(10)--栈的应用-括号匹配

//括号匹配

/*算法思想: 
**若是左括号,入栈,若是右括号,则出栈一个左括号判断是否与之匹配;
**检验栈是否为空,只有栈空,整个字符串才是括号匹配的。 
*/ 
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define ElemType char
using namespace std;


typedef struct SNode{
	ElemType data;
	struct SNode *next; 
}SNode,*SLink;

typedef struct {
	SLink top;
	int count;
}Stack;

//初始化栈
void InitStack(Stack &s);
//入栈操作
bool Push(Stack &s,ElemType e);
//出栈操作
bool Pop(Stack &s,ElemType &e);
//判断栈是否为空
bool Empty(Stack s);
//判断函数 
bool Check(char *str);

int main(void)
{
	char str[20];
	char c;
	printf("请输入要判断的字符串,以#号结束\n");
	int i = 0;
	scanf("%s",str);
	bool result = Check(str);
	if(result)
	{
		printf("匹配成功!");
	}
	else
	{
		printf("匹配失败!"); 
	}
	return 0;
}

//判断函数 
bool Check(char *str)
{
	Stack s;
	InitStack(s); //初始化
	int len = strlen(str); //获取字符串的长度,用来遍历字符串
	ElemType e;
	for(int i = 0;i<len;i++)
	{
		char a = str[i];
		switch(a)
		{
			case '(':
			case '[':
				Push(s,a);
				break;
			case ')':
				if(Pop(s,e))
				{
					if(e!='(')
					{
						return false; //出栈的元素与循环中的元素不匹配 
					}
				}
				else
				{
					return false;
				}
				break;
			case ']':
				
				if(Pop(s,e))
				{
					if(e!='[')
					{
						return false;
					}
				}	
				else
				{
					return false;
				}
				break;
		}
	} 
	if(Empty(s))
	{
		return true; //如果队列为空,则说明完全匹配成功 
	}
	else
	{
		return false;
	} 
}

//初始化栈
void InitStack(Stack &s)
{
	SLink p = (SLink)malloc(sizeof(SNode));
	p->next = NULL;
	s.top = p; //头节点
	s.count = 0; 
}

//入栈操作
bool Push(Stack &s,ElemType e)
{
	SNode *p = (SNode*)malloc(sizeof(SNode));
	p->data = e;
	p->next = s.top->next;
	s.top->next = p;
	s.count++;
	return true;
} 

//出栈操作
bool Pop(Stack &s,ElemType &e)
{
	if(s.count==0)
	{
		return false;
	}
	SNode *p = s.top->next;
	e = p->data;
	s.top->next = p->next;
	s.count--;
	free(p);
	return true;
} 

//判断栈是否为空
bool Empty(Stack s)
{
	if(s.count==0)
	{
		return true;
	}
	else
	{
		return false;
	}
} 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值