【数据结构 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;
}
运行截图