括号匹配的检验(链栈)

问题

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
typedef char ElemType;
typedef struct StackNode* StackLink;
struct StackNode{
	ElemType data;
	StackLink next;
};
//初始化
void InitStack(StackLink &S){
	S = NULL;
	return;
}
//入栈
void Push(StackLink &S, ElemType e){
	StackLink p = (StackLink)malloc(sizeof(StackNode));
	p->data = e;
	p->next = S;
	S = p;
	return;
}
//出栈
void Pop(StackLink &S, ElemType &e){
	e = S->data;
	S = S->next;
	return;
}
//返回栈顶元素
ElemType GetHead(StackLink S){
	if (S == NULL)return 0;
	return S->data;
}
//堆栈判空
bool StackEmpty(StackLink S){
	if (S == NULL)return true;
	return false;
}
//括号匹配的检验
bool Matching(){
	StackLink S;
	InitStack(S);
	ElemType p;
	cin >> p;
	while (p!='#'){
		if (p == '(' || p == '[')//遇左括号直接进栈
			Push(S, p);
		else if (p == ')' || p == ']'){//遇右括号判断
			ElemType e = GetHead(S);
			//若与当前栈顶的左括号类型相同则二者匹配,将栈顶的左括号出栈(相当于去括号)
			if ((e == '('&&p == ')') || (e == '['&&p == ']'))
				Pop(S, e);
			//否则不匹配,返回错误
			//不匹配有两种情况:1.类型不同;2.缺少左括号,若栈空栈顶元素返回的是0,必不匹配
			else
				return false;
		}
		cin >> p;
	}
	//如果栈非空,说明还有没匹配的括号,返回错误
	if (!StackEmpty(S))return false;
	return true;
}
int main(){
	if (Matching())
		printf("OK\n");
	else
		printf("WRONG\n");
	system("PAUSE");
	return 0;
}

括号匹配的检验

步骤:
1.遇左括号直接进栈
2.遇右括号判断
2.1若与当前栈顶的左括号类型相同则二者匹配,将栈顶的左括号出栈(相当于去括号)
2.2否则不匹配,返回错误
2.2注意:不匹配有两种情况:1.类型不同;2.缺少左括号,若栈空栈顶元素返回的是0,必不匹配
3.遇到结束符’#'循环结束,判断栈空,如果栈非空,说明还有没匹配的括号,返回错误
主函数:如果返回正确则正确匹配,否则失败

//括号匹配的检验
bool Matching(){
	StackLink S;
	InitStack(S);
	ElemType p;
	cin >> p;
	while (p!='#'){
		if (p == '(' || p == '[')//遇左括号直接进栈
			Push(S, p);
		else if (p == ')' || p == ']'){//遇右括号判断
			ElemType e = GetHead(S);
			//若与当前栈顶的左括号类型相同则二者匹配,将栈顶的左括号出栈(相当于去括号)
			if ((e == '('&&p == ')') || (e == '['&&p == ']'))
				Pop(S, e);
			//否则不匹配,返回错误
			//不匹配有两种情况:1.类型不同;2.缺少左括号,若栈空栈顶元素返回的是0,必不匹配
			else
				return false;
		}
		cin >> p;
	}
	//如果栈非空,说明还有没匹配的括号,返回错误
	if (!StackEmpty(S))return false;
	return true;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Deosiree

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

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

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

打赏作者

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

抵扣说明:

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

余额充值