1. 程式人生 > >資料結構-棧在括號匹配中的應用

資料結構-棧在括號匹配中的應用

所謂括號校驗匹配其實質是對多種型別括號正確配對的校驗(包括:()、[]、{})即([])或者[()]為正確的表示式,如果出現交叉則匹配失敗,如[(])或([())則為不正確格式。
該程式也運用了棧的思想。若是左括號則入棧,若是右括號則看是否和當前棧頂元素是否匹配。若是則出棧,不是則當前表示式括號不匹配。

程式思想:
1.初始設定一個空棧,順序讀入括號。
2.若是右括號,則使置於棧頂的元素出棧與之匹配,若是括號序列不匹配,則退出程式
3.若是左括號,則將元素壓入棧中,演算法結束時,棧為空,否則括號序列不匹配

以下為示例程式碼:

//棧應用之校驗括號的匹配

#include "stdafx.h"
#include "string.h"

#define ElementType char
#define MaxSize 10
//定義結構體
typedef struct {
	ElementType data[MaxSize];//資料域
	int top;//棧頂指標
	int size;//棧當前容量
}SqStack;

/*
初始化棧
*/
void InitStack(SqStack &s) {
	s.top = -1;
	s.size = 0;
}

/*
判斷棧是否為空
*/
bool StackEmpty(SqStack s) {
	if (s.size == 0) {
		return true;
	}
	return false;
}
/*
入棧
*/
bool PushStack(SqStack &s,ElementType e) {
	//if(s.top==MaxSize-1)
	if (s.size == MaxSize) {
		//棧滿
		return false;
	}
	s.top++;
	s.data[s.top] == e;
	s.size++;
	return true;
}
/*
出棧
*/
ElementType PopStack(SqStack &s) {
	//if(s.top==-1)
	if (s.size==0) {
		//棧空
		return NULL;
	}
	ElementType e = s.data[s.top];
	s.top--;
	s.size--;
	return e;
}
/*
校驗括號是否匹配
*/
bool CheckMatch(char *str) {
	SqStack stack;
	InitStack(stack);
	int len = strlen(str);
	for (int i = 0; i < len; i++)
	{
		char x = str[i];
		ElementType e;
		switch (x) {
		case '(':
			PushStack(stack, x);
			break;
		case '[':
			PushStack(stack, x);
			break;
		case '{':
			PushStack(stack, x);
			break;
		case ')':
			e = PopStack(stack);
			if (e != '(') {
				return false;
			}
			break;
		case ']':
			e = PopStack(stack);
			if (e != '[') {
				return false;
			}
			break;
		case '}':
			e = PopStack(stack);
			if (e != '{') {
				return false;
			}
			break;
		}
	}
	bool b = StackEmpty(stack);
	if (b) {
		return true;
	}
	return false;
}

void main() {
	char str[] = "[({})]";
	bool b = CheckMatch(str);
	if (b) {
		printf_s("匹配成功");
	}
	else
	{
		printf_s("匹配失敗");
	}
}