数据结构与算法学习之路:检查表达式的括号是否匹配——栈

一、什么是栈?

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针

简单来说,栈的特点就是:后进先出


二、栈的基本操作:

1、出栈;2、入栈;3、检查栈是否为空;4、检查栈是否已满;


三、括号匹配怎么实现?

首先,对于一条表达式来说,我们只关心括号是否匹配。换言之,我们只需要检查所有左括号是否都有对应的有括号就可以了。所以我们获得了一条表达式以后,逐个字符逐个字符检查,遇到左括号就入栈,同时把对应括号的计数器减一(int result = 0;),当遇到右括号就出栈一个左括号,同时计数器加一。如果最后计数器的为0,表示已经匹配,其他情况都是未匹配。

 

四、代码实现: 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0

#define STACK_SIZE 20
#define STRING_SIZE 64

typedef int Status;

typedef struct Stack{
	char string[STACK_SIZE];
	int top;
}Stack,*StackPtr;

Status Stack_Init(StackPtr s);
void Stack_Pop(StackPtr s);
void Stack_Push(StackPtr s, char elem);
Status Stack_IsFull(StackPtr s);
Status Stack_IsEmpty(StackPtr s);

int main(){
	StackPtr stack;
	int i,result = 0;
	char input[STRING_SIZE];

	stack = (StackPtr)malloc(sizeof(Stack));

	if (Stack_Init(stack)){
		printf("请输入表达式:\n");
		gets(input);

		for (i = 0; i < STRING_SIZE; i++){
			if (input[i] == '#')
				break;

			if (input[i] == '(' || input[i] == '{' || input[i] == '['){
				Stack_Push(stack, input[i]);
				++result;
			}
			else if (input[i] == ')' || input[i] == '}' || input[i] == ']'){
				Stack_Pop(stack);
				--result;
			}
		}

		if (result == 0){
			printf("所有括号匹配成功!\n");
			return 0;
		}

		printf("有括号未匹配!\n");
		return 0;
	}
	return 0;
}

Status Stack_Init(StackPtr s){
	s->top = -1;

	if (s == NULL){
		printf("ERROR!!!分配内存失败!");
		return FALSE;
	}
	
	return TRUE;
}

void Stack_Pop(StackPtr s){
	if (!Stack_IsEmpty(s))
		s->string[s->top--] = -1;
	else
		printf("ERROR!!!栈为空,无法进行出栈操作!");
}

void Stack_Push(StackPtr s, char elem){
	if (!Stack_IsFull(s))
		s->string[s->top++] = elem;
	else
		printf("ERROR!!!栈已满,无法进行入栈操作!");
}

Status Stack_IsEmpty(StackPtr s){
	if (s->top == -1)
		return TRUE;

	return FALSE;
}

Status Stack_IsFull(StackPtr s){
	if (s->top == (STRING_SIZE - 1))
		return TRUE;

	return FALSE;
}


你可能感兴趣的:(数据结构与算法学习之路:检查表达式的括号是否匹配——栈)