栈与队列算法设计:(2)括号匹配

1.题目

   假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”以及花括号”{“和”}“,且这三种括号可按任意的次序嵌套使用,请设计算法判断给定的表达式所包含的括号是否能正确配对。

2.题目分析

   1.首先,我们获得用户输入的表达式,同时判断左括号和右括号的数量是否相等,如果不相等直接返回匹配失败。其中左括号包括”(“、“[”、“{”,右括号包括“)”、“]”、“}”。

BOOL CountMatch(char* String)
{
	int LeftCount = 0;    //左括号计数
	int RightCount = 0;   //右括号计数
	int i = 0;
	while (String[i] != '\0')
	{
		if (String[i] == '(' || String[i] == '[' || String[i] == '{')
		{
			LeftCount++;   //如果有左括号,计数递增
		}
		if (String[i] == ')' || String[i] == ']' || String[i] == '}')
		{
			RightCount++;   //如果有右括号,计数递增
		}
		i++;
	}
	if (LeftCount == RightCount)
	{
		return TRUE;         //判断左右括号个数是否相等
	}
	else
	{
		return FALSE;
	}
}

   2.接着,当左右括号数量相等时,我们开始括号的匹配。
    首先,我们将获得用户输入的字符串依次入栈,直到遇到字符串中的右括号。这时,我们依次弹出栈顶元素,直到弹出第一个左括号,比较这个左括号和右括号是否匹配。如果不匹配,直接返回匹配失败;否则继续循环,进行括号匹配。
在这里插入图片描述

int BracketMatch(char LeftBracket, char RightBracket)
{
	if (RightBracket == ')')
	{
		if (LeftBracket == '[' || LeftBracket == '{')
		{
			return 0;
		}
		else if (LeftBracket == '(')
		{
			return 1;
		}
	}
	else if (RightBracket == ']')
	{
		if (LeftBracket == '(' || LeftBracket == '{')
		{
			return 0;
		}
		else if (LeftBracket == '[')
		{
			return 1;
		}
	}
	else if (RightBracket == '}')
	{
		if (LeftBracket == '[' || LeftBracket == '(')
		{
			return 0;
		}
		else if (LeftBracket == '{')
		{
			return 1;
		}
	}
	else
	{
		return -1;
	}
}

3.参考代码

#include<Windows.h>
#include<tchar.h>
#include <iostream>
using namespace std;

#define MaxSize 100

typedef struct STACK
{
	char Character[MaxSize];
	int Top;
}Stack,*PStack;
//压栈操作
BOOL PushData(Stack &Stack, char Character)
{
	if (Stack.Top == MaxSize - 1)
	{
		return FALSE;
	}
	else
	{
		Stack.Top++;
		Stack.Character[Stack.Top] = Character;
		return TRUE;
	}
}
//出栈操作
char PopData(Stack &Stack)
{
	if (Stack.Top == -1)
	{
		return 0;
	}
	else
	{

		char v1 = Stack.Character[Stack.Top];
		Stack.Top--;
		return v1;
	}
}
//括号匹配
int BracketMatch(char LeftBracket, char RightBracket)
{
	if (RightBracket == ')')
	{
		if (LeftBracket == '[' || LeftBracket == '{')
		{
			return 0;
		}
		else if (LeftBracket == '(')
		{
			return 1;
		}
	}
	else if (RightBracket == ']')
	{
		if (LeftBracket == '(' || LeftBracket == '{')
		{
			return 0;
		}
		else if (LeftBracket == '[')
		{
			return 1;
		}
	}
	else if (RightBracket == '}')
	{
		if (LeftBracket == '[' || LeftBracket == '(')
		{
			return 0;
		}
		else if (LeftBracket == '{')
		{
			return 1;
		}
	}
	else
	{
		return -1;
	}
}
//括号个数
BOOL CountMatch(char* String)
{
	int LeftCount = 0;
	int RightCount = 0;
	int i = 0;
	while (String[i] != '\0')
	{
		if (String[i] == '(' || String[i] == '[' || String[i] == '{')
		{
			LeftCount++;
		}
		if (String[i] == ')' || String[i] == ']' || String[i] == '}')
		{
			RightCount++;
		}
		i++;
	}
	if (LeftCount == RightCount)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
//对字符串进行操作  (主要函数)
void TravelString(Stack &Stack, char* String)
{
	int i = 0;
	//如果左右括号个数不同,则返回失败
	if (CountMatch(String) == FALSE)
	{
		printf("左右括号个数不同,匹配失败!");
	}
	else
	{
	    //遍历字符串
		while (String[i] != '\0')
		{
		    //将字符依次压栈,直到遇到右括号
			if (String[i] != ')' && String[i] != ']' && String[i] != '}')
			{
				PushData(Stack, String[i]);
			}
			else
			{
			    //弹出栈顶元素,与右括号进行匹配
				char v1 = PopData(Stack);
				while (BracketMatch(v1, String[i]) != 1)
				{
					if (BracketMatch(v1, String[i]) == 0 || Stack.Top == -1)
					{
						printf("括号匹配失败!");
						return;
					}
					else
					{
						v1 = PopData(Stack);
					}
				}
				printf("%c %c ", v1, String[i]);
			}
			i++;
		}
	}
}

int main()
{
	Stack Stack;
	Stack.Top = -1;
	char v1[MaxSize] = { 0 };
	printf("请输入一个含有括号的字符串:");
	cin >> v1;
	printf("括号匹配结果为:");
	TravelString(Stack, v1);
}

4.测试结果

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值