【数据结构】用栈的基本运算进行括号检测

本人是一个编程小白,最近在学习数据结构的基础知识,学到栈和队列的时候,老师布置了“用栈的基本运算进行括号检测”这样一个实验题目,经过几天的学习和搜集资料,想将自己写的程序上传上来让广大网友帮忙看看有什么错误,大家互相学习一下,我也可以加深一下理解。(本人用的编程软件是最简单的Dev c,所学的教程是严蔚敏教授的《数据结构c语言版》)

以下是程序所需要的头文件以及宏定义的常量:

#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define OK 1
#define ERROR 0

 以下是所定义的结构体:

typedef struct{
	ElemType *base;
	ElemType *top;//栈顶指针 
	int stacksize;//当前已分配空间; 
}SqStack;

以下是栈的基本操作(包括init(创建空栈)、push(入栈)、pop(出栈)、gettop(取栈顶元素)):

值得注意的一点是很多跟我一样的小白刚开始没明白Status和ElemType是什么意思,其实是在结构体定义前所定义的宏定义:

Status InitStack(SqStack &S)
{
	S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
	if(!S.base)
	{
		exit(OVERFLOW); 
	}
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK; 
}
Status Push(SqStack &S,ElemType e)
{
	if(S.top-S.base>=S.stacksize)//是否栈满 
	{
		S.base=(ElemType*)realloc(S.base,(S.stacksize+STACK_INIT_SIZE)*sizeof(ElemType));//若满,追加存储空间 
		if(!S.base)
		{
			exit(OVERFLOW); 
		}
		S.top=S.stacksize+S.base;
		S.stacksize+=STACK_INIT_SIZE; 
	}
	*S.top++=e;//插入元素e
	return OK; 
}
Status Pop(SqStack &S)
{
	if(S.top==S.base)
	{
		return ERROR;//栈空 
	}
	S.top--;//删除栈顶元素
	return OK; 
}
char GetTop(SqStack S)
{
	int e;
	if(S.top==S.base)
	{
		return ERROR; 
	}	
	e=*(S.top-1);//返回栈顶元素
	return e;
}

以下便是这篇文章的重点:如何进行括号检测

void MatchSqStack(SqStack &S)
{
	char temp;
	char arr[50];
	printf("请输入要进行匹配的带括号表达式:");
	scanf("%s",arr);
	int count=0;
	for(int i=0;i

用简单的语言来描述就是输入一个表达式,通过for循环来遍历表达式的每一个字符,再通过switch语句来判断表达式中有无括号,将左右括号进行匹配,中间用count来计数,如果左右括号相匹配,则pop将括号做出栈操作,否则count++。如果count到最后不是原来的0,则证明匹配的过程有不匹配的括号,最后通过判断栈是否为空以及count是否为0即可知道是否匹配成功。

那么为什么要以栈是否为空作为判断条件呢?

道理很简单,在遍历的过程中如果遇到左括号,则会进行push操作将括号压入栈,如果遇到的是右括号,则会进行是否有相应的左括号相匹配的判断,如果有,则会pop将左括号移出栈,如果没有,就是前面的count+1,这样的话,只要括号成双成对,在判断完之后就会移出栈,所以就可以用栈为空作为判断条件,如果不是空,则证明有单着的很孤独的一半括号在栈中流泪。

count==0作为判断条件是因为这样可以防止多个右括号匹配一个左括号的情况发生。

此程序还有个小问题:输入的表达式必须带着括号,否则无论输入什么都会显示匹配成功。

如果有能够解决这个问题的大神欢迎留言,感谢感谢。

完整代码如下:

#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct{
	ElemType *base;
	ElemType *top;//栈顶指针 
	int stacksize;//当前已分配空间; 
}SqStack;
Status InitStack(SqStack &S)
{
	S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
	if(!S.base)
	{
		exit(OVERFLOW); 
	}
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK; 
}
Status Push(SqStack &S,ElemType e)
{
	if(S.top-S.base>=S.stacksize)//是否栈满 
	{
		S.base=(ElemType*)realloc(S.base,(S.stacksize+STACK_INIT_SIZE)*sizeof(ElemType));//若满,追加存储空间 
		if(!S.base)
		{
			exit(OVERFLOW); 
		}
		S.top=S.stacksize+S.base;
		S.stacksize+=STACK_INIT_SIZE; 
	}
	*S.top++=e;//插入元素e
	return OK; 
}
Status Pop(SqStack &S)
{
	if(S.top==S.base)
	{
		return ERROR;//栈空 
	}
	S.top--;//删除栈顶元素并用e返回
	return OK; 
}
char GetTop(SqStack S)
{
	int e;
	if(S.top==S.base)
	{
		return ERROR; 
	}	
	e=*(S.top-1);
	return e;
}

void MatchSqStack(SqStack &S)
{
	char temp;
	char arr[50];
	printf("请输入要进行匹配的带括号表达式:");
	scanf("%s",arr);
	int count=0;
	for(int i=0;i

你可能感兴趣的:(数据结构,数据结构)