//
// Created by 15267 on 2021/9/27.
// 数据结构-栈的应用——括号匹配
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct LNode{
char data;
struct LNode *next; // 定义指向后驱结点的指针
}LNode,*LinkStack;
void InitStack(LinkStack &S); // 初始化链栈
bool StackEmpty(LinkStack S); // 判断栈是否为空
bool Push(LinkStack &S, char c); // 入栈
char Pop(LinkStack &S); // 出栈:弹出栈顶元素
bool BMatch(LinkStack &S, char c[]); // 括号匹配检验
int main(){
char c[10]; // 设置数组长度
LNode *S;
InitStack(S); // 初始化链栈
cout << "请输入要匹配的括号:"<< endl;
cin >> c; // 输入长度小于10的括号字符串
if(BMatch(S,c)){
cout << "匹配成功";
}
return 0;
}
void InitStack(LinkStack &S){
S = (LNode*) malloc(sizeof(LNode)); // 为栈顶开辟存储空间
S->next = NULL; // 栈顶初始指向NULL
}
bool BMatch(LinkStack &S, char c[]){
int x = 0;
while (x < 10 && c[x] != '\0'){ // 判断
if(c[x] == '(' || c[x] == '{' || c[x] == '['){
Push(S,c[x]); // 如果是左括号入栈
x++;
} else {
// 如果是右括号就出栈一个括号,判断是否与右括号匹配
if(c[x] == ')' && Pop(S) != '('){
cout << "左括号不匹配";
return false;
} else if(c[x] == '}' && Pop(S) != '{'){
cout << "左括号不匹配";
return false;
} else if(c[x] == ']' && Pop(S) != '['){
cout << "左括号不匹配";
return false;
} else{
x++;
}
}
}
if(!StackEmpty(S)){
// 当数组遍历完后栈还存在括号,说明有右括号单身,或者左括号太多
cout << "右括号存在单身";
return false;
} else{
return true;
}
}
// 判断栈是否为空
bool StackEmpty(LinkStack S) {
if(S->next == NULL)
return true;
else
return false;
}
// 入栈
bool Push(LinkStack &S, char c){
LNode *v = (LNode*) malloc(sizeof(LNode)); // 为新结点开辟存储空间
v->next = S->next; // 将新结点从栈顶插入,新结点的后驱为上一个入栈的元素
v->data = c; // 新结点赋值
S->next = v; // 栈顶指向新结点
return true;
}
// 出栈:弹出栈顶元素
char Pop(LinkStack &S) {
if(!StackEmpty(S)){
LNode *v = S->next; // 获取栈顶元素
S->next = v->next; // 栈顶指针指向当前栈顶元素的后驱结点
char z = v->data;
free(v); // 释放存储空间
return z;
}
return '\0';
}
括号匹配-链栈的应用
最新推荐文章于 2023-04-24 23:15:45 发布