資料結構括號匹配問題

是小飛象啦啦啦發表於2020-11-14

資料結構括號匹配問題

要求大、中、小括號兩兩匹配,基本思路可以通過棧來實現。這裡我使用的是簡單的靜態順序棧,大小固定,同時定義了棧頂指標top。程式包含了棧的幾個最基本的操作,初始化、判空、壓入、彈出,此外還有一個匹配函式,該函式接受一個陣列和其長度做引數,判斷是否括號匹配成功。然後是處理括號的問題,思路是掃描陣列中的括號,遇到左括號就進行壓棧操作,遇到右括號先判斷棧中是否還有元素(即左括號),若沒有則右括號“單身”,匹配失敗,若棧中存在元素,就進行出棧操作,將棧頂的元素彈出與右括號進行配對,判斷是否成功,在掃描完所有的括號後,判斷棧中是否還有元素,若有,則左括號“單身”,匹配失敗,若棧空,則最終匹配成功,結束程式。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 20
typedef struct {
	char data[MAXSIZE];
	int top;
}SqStack;
typedef int Status;
Status InitStack(SqStack* S) {
	//構造一個空棧
	S->top = -1;
	return OK;
}
Status StackEmpty(SqStack S) {
	if (S.top == -1) { printf("\n棧空!\n");return TRUE; }
	else { return FALSE; }
}
Status Push(SqStack* S,char str) {
	if (S->top==MAXSIZE-1) {
		printf("\n棧滿!\n");
		exit(OVERFLOW);
	}
	S->data[++S->top] = str;
	printf("\n壓入元素%c\n", str);
	return OK;
}
Status Pop(SqStack* S, char* str) {
	if (S->top == -1) {
		printf("\n棧空!\n");
		return ERROR;
	}
	*str = S->data[S->top--];
	printf("\n彈出元素%c\n", *str);
	return OK;
}
Status Check(char str[], int length) {
	SqStack S;
	InitStack(&S);
	printf("\n成功!\n");
	for (int i = 0;i < length;i++) {
		if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
			Push(&S, str[i]);//掃描到左括號,入棧
		} else {
			if (StackEmpty(S)) {
				printf("\n匹配失敗\n");
				return FALSE;
			}
				
			char topelem = '\0';
			Pop(&S, &topelem);
			if (str[i] == ')' && topelem != '(')
			{
				printf("\n匹配失敗\n");
				return FALSE;
			}
			if (str[i] == ']' && topelem != '[')
			{
				printf("\n匹配失敗\n");
				return FALSE;
			}
			if (str[i] == '}' && topelem != '{')
			{
				printf("\n匹配失敗\n");
				return FALSE;
			}
				
		}
			
	}
	if (StackEmpty(S)) { printf("\n匹配成功\n");return OK; }
	else {
		printf("\n匹配失敗\n");
		return FALSE;
	}
	return OK;
}
void main() {
	printf("\n請向棧中寫入括號(輸入“#”結束輸入):\n");
	int temp = 0;
	char string[MAXSIZE] = { '\0' };
	for (int i = 0;;i++) {
		scanf_s("%c", &string[i],sizeof(string));
		if (string[i] == '#')break;
		temp++;
	}
	Check(string, temp);
}

C語言實現

相關文章