3.2.2--括号匹配的检验

3.2.2–栈的应用(括号匹配的检验)

《数据结构》严蔚敏版习题3.2.2,括号匹配问题。是顺序栈的课后习题。原问题:假设表达式中允许包括两种括号:圆括号和方括号,其嵌套方式随意,即(【】())等都是正确的格式,【(】)是不正确的格式。设计一个算法检查输入的字符串中的括号是否是匹配的。

思路:
建立数组遍历,遇到<{([则入栈>}])则进行匹配出栈操作,如不匹配则也压入栈。第一个元素为>}])直接为不匹配,最后栈为空说明括号匹配。
代码:

#include<iostream>//ZJJ数据据结构-栈3.2.2
using namespace std;
typedef int Status;
#define INITSIZE 100
#define INTREMENT 100
typedef struct {/*定义顺序栈*/
	char* base;
	char* top;
	int size;
}SqStack;
Status InitStack(SqStack* s)/*创建(顺序栈)栈*/
{
	s->base = (char*)malloc(INITSIZE * sizeof(char));
	if (!s->base)
	{
		cout << "栈创建失败" << endl;
	}
	s->top = s->base;
	s->size = INITSIZE;
	return 1;
}
Status Push(SqStack* s, char e)//入栈
{
	if (s->top - s->base >= s->size)
	{
		s->base = (char*)realloc(s->base, (s->size + INTREMENT) * sizeof(char));
		if (!s->base)
		{
			cout << "栈创建失败" << endl;
			exit(1);
		}
		s->top = s->base + s->size;
		s->size += INTREMENT;
	}
	*(s->top) = e;
	s->top++;
	return 1;
}
Status Pop(SqStack* s, char* e)//出栈
{
	if (!s->base)
	{
		cout << "栈创建失败" << endl;
		exit(1);
	}
	s->top--;
	*e =* (s->top);
	return 1;
}
int StackLength(SqStack* s)//计算栈长度
{
	return(s->top - s->base);
}
void Print(SqStack* s)//打印栈的剩余元素
{
	if (!s->base)
	{
		cout << "栈创建失败" << endl;
		exit(1);
	}
	char* t = s->top - 1;
	while (t >= s->base)
	{
		cout << *t << endl;
		t--;
	}
}
Status StackEmpty(SqStack* s)//判断是否为空栈
{
	if (s->top == s->base)
	{
		return 1;
	}
	else
		return 0;
}
Status GetTop(SqStack* s, char* e)//获取栈的第一个元素
{
	if (s->top == s->base)
	{
		return 0;
	}
	*e = *(s->top - 1);
	return 1;
}
int main()
{
	SqStack s, * sp = &s;
	InitStack(sp);
	char str[20];
	cin >> str;
	if (str[0] == ']' || str[0] == ')' || str[0] == '}' || str[0] == '>')//判断第一个元素是否符合
	{
		cout << "括号不匹配" << endl;
		exit(0);
	}
	char c, d, * cp = &c, * dp = &d;
	for (int i = 0, c = str[0];c != '\0';i++)//遍历各个元素进行出入栈的操作
	{
		c = str[i];
		if (!StackEmpty(sp))
		{
			GetTop(sp, dp);
		}
		char t, * tp = &t;
		switch (c)
		{
		case'[':
			Push(sp, c);
			break;
		case'{':
			Push(sp, c);
			break;
		case'<':
			Push(sp, c);
			break;
		case'(':
			Push(sp, c);
			break;
		case']':
		{
			if (d == '[')
			{
				Pop(sp, tp);
			}
			else
				Push(sp, c);
			break;
		}
		case'}':
		{
			if (d == '{')
			{
				Pop(sp, tp);
			}
			else
				Push(sp, c);
			break;
		}
		case'>':
		{
			if (d == '<')
			{
				Pop(sp, tp);
			}
			else
				Push(sp, c);
			break;
		}
		case')':
		{
			if (d == '(')
			{
				Pop(sp, tp);
			}
			else
				Push(sp, c);
			break;
		}
		break;
		default:break;
		}
	}
		cout << "当前栈长:" << StackLength(sp);
		if (StackEmpty(sp))
			cout << "括号匹配" << endl;
		else {
			cout << "括号不匹配" << endl;
		}
		Print(sp);
		return 0;
	
}

实验结果:
请添加图片描述
有无欠缺的,欢迎指正。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZJJ啥都学不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值