栈的应用----括号匹配问题

借鉴于MOOC西北大学数据结构视频参考

typedef struct Stack

{

char ch;

Stack* next;

}Stack,*PStack;

单向链式存储结构

void PushStack(PStack stack, char* str) //左括号入栈
{
PStack Top = new Stack;
Top->ch = *str;
Top->next = stack->next;
stack->next = Top;
}

bool PopStack(PStack stack, char* str)//左括号出栈
{
if (!stack->next)
return false;
PStack Top = stack->next;
stack->next = Top->next;
*str = Top->ch;
delete Top;
return true;
}

非常简单的出入栈操作 这里就说下进栈操作不用加判栈满操作是因为 毕竟是绳不是杯 只要内存有空间就能进栈 所以不加判满

bool GetStackTop(const PStack stack, char* str)//取栈顶操作
{
if (!stack->next)//栈空时返回false
return false;
*str = stack->next->ch;
return true;
}
bool VeriyOp(const char *str1,const char*str2)//检验括号是否匹配
{
switch (*str1)
{
case ‘(‘:
if ((*str2) == ‘)’) return true;
else return false;
case ‘{‘:
if ((*str2) == ‘}’) return true;
else return false;
case ‘[‘:
if ((*str2) == ‘]’) return true;
else return false;
}
}

检验栈顶括号是否与检测括号匹配  *str1栈顶左括号,*str2是待检测的右括号  成功匹配返回真

下面就是主要解决过程

首先判断括号数是否是奇数,奇数情况直接返回错误,终止。

 否则,依次取括号判断入栈、匹配。

bool OperatorS(char * str)//括号匹配solution
{

char Topch;
int i = 0;  //判断括号个数
PStack a = new Stack;
InitStack(a);
for (i = 0; *(str + i) != ‘\0’; ++i)
{ }//累计计算括号个数 

if (*(str + i) == ‘\0’&&i % 2)//括号个数若为奇数 直接返回 不入栈
{
cout << “括号匹配错误,个数为” << i << “个” << endl;
return false;
}

for (i = 0; *(str + i) != ‘\0’; ++i)
{
switch (*(str + i))
{
case ‘{‘:
case ‘[‘:
case ‘(‘:
PushStack(a, str + i);//左括号入栈
break;
case ‘}’:
case ‘]’:
case ‘)’:
if (!PopStack(a, &Topch)|!VeriyOp(&Topch, str + i))//检验括号是否匹配操作,其中两个判断条件位置顺序不可交换
{
cout << *(str+i)<<“括号匹配错误” << endl;
return false;
}
break;
default:
break;
}
}
return true;
}

typedef struct Stack
{
	char ch;
	Stack* next;
}Stack,*PStack;

void InitStack(PStack stack)//初始化
{
	stack->ch = NULL;
	stack->next = NULL;	
}

void PushStack(PStack stack, char* str) //左括号入栈
{
	PStack Top = new Stack;
	Top->ch = *str;
	Top->next = stack->next;
	stack->next = Top;
}

bool PopStack(PStack stack, char* str)//左括号出栈
{
	if (!stack->next)
		return false;
	PStack Top = stack->next;
	stack->next = Top->next;
	*str = Top->ch;
	delete Top;
	return true;
}

bool GetStackTop(const PStack stack, char* str)//取栈顶操作
{
	if (!stack->next)//栈空时返回false
		return false;
	*str = stack->next->ch;
	return true;
}
bool VeriyOp(const char *str1,const char*str2)//检验括号是否匹配
{
	switch (*str1)
	{
	case '(':
		if ((*str2) == ')') return true;
		else return false;
	case '{':
		if ((*str2) == '}') return true;
		else return false;
	case '[':
		if ((*str2) == ']') return true;
		else return false;
	}
}
bool OperatorS(char * str)//括号匹配solution
{
	
	char Topch;
	int i = 0;  //判断括号个数
	PStack a = new Stack;
	InitStack(a);
	for (i = 0; *(str + i) != '\0'; ++i)
	{ }//累计计算括号个数 
		
	if (*(str + i) == '\0'&&i % 2)//括号个数若为奇数 直接返回 不入栈
	{
		cout << "括号匹配错误,个数为" << i << "个" << endl;
		return false;
	}
			

	for (i = 0; *(str + i) != '\0'; ++i)	
	{
		switch (*(str + i))
		{
		case '{':
		case '[':
		case '(':
			PushStack(a, str + i);//左括号入栈
			break;
		case '}':
		case ']':
		case ')':
			if (!PopStack(a, &Topch)|!VeriyOp(&Topch, str + i))//检验括号是否匹配操作,其中两个判断条件位置顺序不可交换
			{
				cout << *(str+i)<<"括号匹配错误" << endl;
				return false;
			}
			break;
		default:
			break;
		}
	}
	return true;
}

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/gamedevgra/article/details/54709576
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞