数据结构:C++链栈解决括号匹配问题

问题描述

给定一串字符(以’#’结束,不超过100个字符),可能包括三种括号:小括号、中括号和大括号,各种括号之间允许任意的嵌套,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入格式:
输入一字符串(以’#’结束,不超过100个字符),可能包括三种括号:小括号、中括号和大括号,各种括号之间允许任意的嵌套。
输出格式:
如果括号配对,输出配对成功信息,否则输出配对不成功信息。
2.测试数据
(1) ([]{})
(2) {[}]
(3) {{}
(4) ())

代码内容

#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
//dypedef:为一种数据类型定义一个新名字
typedef char SElemType;	
typedef char ElemType;
typedef int Status;
//链栈存储结构
typedef struct Node{
	ElemType data;
	struct Node *next;
}stacknode,*LinkStack;
//链栈初始化 
Status InitStack(LinkStack &S){
	//构造一个空栈S,栈顶指针置空
	S=NULL;
	return OK;
}
//链栈入栈
Status Push(LinkStack &S,SElemType &e){
	LinkStack p=new stacknode;	//生成新节点
	p->data=e;	//数据域置e
	p->next=S;	//将新节点插入栈顶
	S=p;	//修改栈顶指针为p
	return OK;
}
//链栈的出栈
Status Pop(LinkStack &S,SElemType &e){
	//删除S的栈顶元素,用e返回其值
	if(S==NULL)	//判断是否为空栈
		return ERROR;
	LinkStack p=S; 	//定义新节点,用于临时保存S栈顶元素的空间,以备释放
	e=S->data;		//将栈顶元素赋值给e
	S=S->next;		//修改栈顶指针
	delete p;		//释放原栈顶空间
	return OK;
}
//取栈顶元素
SElemType GetTop(LinkStack S){
	if(S!=NULL)
		return S->data; 	//返回栈顶元素,栈顶指针不变
}
void Matching(){
	LinkStack S;
	InitStack(S);	//初始化空栈
	char ch,x;
	cin>>ch;		//读取第一个字符
	int flag=1,count=1;	//用于标记是否匹配成功
	//以#结束且不超过100个字符
	while(ch!='#'&&flag&&count<=100){
		switch(ch){
			case '{':
			case '[':
			case '(':		//若是左括号,将其压入栈
				Push(S,ch);
				break;
			//若是右括号,分类型进行匹配
			case ')':
				if(S!=NULL&&GetTop(S)=='(')
					Pop(S,x);
				else flag=0;
				break;
			case ']':
				if(S!=NULL&&GetTop(S)=='[')
					Pop(S,x);
				else flag=0;
				break;
			case '}':
				if(S!=NULL&&GetTop(S)=='{')
					Pop(S,x);
				else flag=0;
				break;
		}
		cin>>ch;	//继续读取下一个字符
		count++;		//计数器
	}
	//如果栈空且都能匹配成功,则匹配成功,否则匹配失败
	if(S==NULL&&flag)	
		cout<<"匹配成功"<<endl;
	else
		cout<<"匹配失败"<<endl; 
}
int main(){
	Matching();	//主函数调用方法
	return 0;
} 

测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

括号匹配问题主要就是考察对栈的使用,通过入栈和出栈来进行匹配,入栈出栈等操作既可以使用顺序栈也可以使用链栈来实现,我这里使用的是链栈,主要是因为代码量比顺序栈相对少点0.0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

82年苏打

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

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

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

打赏作者

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

抵扣说明:

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

余额充值