【數據結構 C描述】設計一個程序用於檢測輸入的符號是否匹配,如果不匹配則輸出提示並退出。

這裏使用鏈棧的方式實現。

//main.cpp
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#include "LinkStack.h"
using namespace std;

int main()
{
	char arr[50];
	int arrLength = sizeof(arr) / sizeof(char);
	int num = 0;
	cout << "您要輸入幾個字符?:";
	cin >> num;
	cout << "\n\n請輸入英文括號字符:";
	cin >> arr;
	cout << "\n\n當前輸入的字符爲:";
	cout << arr;
	
	bool Match_Brackets(char exp[], int n);
	cout << "\n\n檢查括號是否匹配的情況:";
	Match_Brackets(arr, num);
	
	system("pause");
	cout << "\n";
	return 0;
}


bool Match_Brackets(char exp[],int n) {
	LinkStack *LS;
	InitLinkStack(LS);
	char e;											//存放元素的變量
	bool match = true;
	//開始操作
	for (int i = 0; i < n; i++) {
		//遍歷數組存放之前輸入的括號符號,將左括號放入棧中
		if (exp[i] == '(' || exp[i] == '[') {
			LinkStack_Push(LS, exp[i]);
		}

		//如果 ) 右括號進來
		else if (exp[i] == ')') {					
			//取出上次棧頂元素進行匹配,e存放上次棧頂元素(即左括號)
			if (LinkStack_GetTop(LS, e) == true) {
				
				if (e != '(') {
					match = false;					//如果上一個元素不是對應的左括號,則匹配失敗
				}
				else {
					LinkStack_Pop(LS, e);			//否則匹配成功,出棧
				}
			}
		}

		//如果 ] 右括號進來
		else if (exp[i] == ']') {					
			if (LinkStack_GetTop(LS, e) == true) {
				//取出上次棧頂元素進行匹配,e存放上次棧頂元素(即左括號)
				if (e != '[') {
					match = false;					//如果上一個元素不是對應的左括號,則匹配失敗
				}
				else {
					LinkStack_Pop(LS, e);			//否則匹配成功,出棧
				}
			}
		}

		//取不到棧頂元素的情況
		else {
			match = false;
			cout << "匹配失敗。\n\n";
		}

	}

	//當棧不爲空的時候,則匹配失敗。即棧爲空時纔是所有括號匹配成功
	if (!EmptyLinkStack(LS)) {
		match = false;
		cout << "匹配失敗。\n\n";
	}
	else cout << "匹配成功。\n\n";
	DestoryLinkStack(LS);
	return match;
}
//LinkStack.h
/* 鏈棧的實現 */

#include <iostream>
using namespace std;

typedef char LinkStack_ElemType;
typedef struct LinkNode {
	LinkStack_ElemType data;
	struct LinkNode *next;
}LinkStack;

void InitLinkStack(LinkStack *&LS) {
	LS = (LinkStack *)malloc(sizeof(LinkStack));
	LS->next = NULL;
}

void DestoryLinkStack(LinkStack *&LS) {
	LinkStack *pre = LS, *p = LS->next;
	while (p != NULL) {
		free(pre);
		pre = p;
		p = pre->next;
	}
	free(pre);
}

bool EmptyLinkStack(LinkStack *LS) {
	return (LS->next == NULL);
}

void LinkStack_Push(LinkStack *&LS, LinkStack_ElemType e) {
	LinkStack *p;
	p = (LinkStack *)malloc(sizeof(LinkStack));
	p->data = e;
	p->next = LS->next;
	LS->next = p;
}

bool LinkStack_Pop(LinkStack *&LS, LinkStack_ElemType &e) {
	LinkStack *p;			//頭節點指針
	if (LS->next == NULL) {
		return false;
	}
	p = LS->next;			//H指向首節點
	e = p->data;			//提取首節點的值
	LS->next = p->next;		//刪除首節點
	free(p);
	return true;
}

bool LinkStack_GetTop(LinkStack *LS, LinkStack_ElemType &e) {
	if (LS->next == NULL) return false;
	e = LS->next->data;
	return true;
}

運行截圖
在這裏插入圖片描述