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.测试结果