1. 程式人生 > >棧的應用-括號的匹配檢驗

棧的應用-括號的匹配檢驗

開發十年,就只剩下這套架構體系了! >>>   

問題描述

        假設表示式中允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,即([]())或[([][])]等為正確的格式,[(]或[())]等為非法格式,試寫一個演算法檢驗括號的格式是否正確。

解題思路

        使用棧這種資料結構,當遇到左半邊的符號時,進棧,如遇到右半邊的符號時,出棧操作,如果符號不是同一隊符號,則重新入棧,程式結束後,根據棧是否為空棧判斷括號的格式是否正確,如果是正確,則棧為空棧,否則相反。

        程式是根據嚴蔚敏老師的資料結構一書寫就的,最後判斷括號是否全匹配的操作我有點迷。

程式實現

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

/**
 * 棧的簡單操作:判斷括號是否成對
 */
#define STACK_INIT_SIZE 100
typedef struct Stack {
	char *base;
	char *top;
	int stackSize;
} SqStack;
void initStack(SqStack *stack);
int pushStack(SqStack *stack, char element);
int popStack(SqStack *stack, char *element);
int main(int argc, char *argv[]) {
	SqStack stack;
	initStack(&stack);
	printf("請輸入要匹配的括號:\n");
	char element, result;
	scanf("%c", &element);
	while (element != '#') {
		if ((int)element == 91 || (int)element == 40) {
			pushStack(&stack, element);
		} else {
			popStack(&stack, &result);
			if ((element == ']' && result != '[') || (element == ')' && result != '(')) {
				pushStack(&stack, result);
			}
		}
		getchar();
		scanf("%c", &element);
	}
	if (*stack.top == *stack.base) {
		printf("括號全匹配!");
	} else {
		printf("括號匹配失敗!");
	}
	return 0;
}

/**
 * 初始化棧
 */
void initStack(SqStack *stack) {
	stack->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
	if (!stack->base) {
		exit(-1);
	}
	stack->stackSize = 100;
	stack->top = stack->base;
}

/**
 * 入棧操作
 */
int pushStack(SqStack *stack, char element) {
	// 棧已滿
	if (stack->top - stack->base >= stack->stackSize) {
		return -1;
	}
	*stack->top++ = element;
	return 1;
}

/**
 * 出棧操作
 */
int popStack(SqStack *stack, char *element) {
	// 棧已空
	if (stack->top == stack->base) {
		return -1;
	}
	*element = *--stack->top;
	return 1;
}