【数据结构 C描述】设计一个程序用于检测输入的符号是否匹配,如果不匹配则输出提示并退出。

版权声明:AlanLee版权所有 https://blog.csdn.net/qq1445654576/article/details/83217582

这里使用链栈的方式实现。

//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;
}



运行截图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq1445654576/article/details/83217582