假设表达式中允许包括三种括号 “(” “{” “[”。嵌套顺序随意,“({}[])”或“{]({{}}))”都可以。但是第一种正确,第二种不正确。检验括号是否匹配可用“期待的急迫程度”这个概念来描述。如果当前括号为“(”下一个括号为“)”,则匹配,即可弹栈。而当前括号为“(”,而下一个括号为“}”。则将“}”压栈。当读取完所有括号后。检验栈是否为空即可。如果栈为空,则括号都已匹配,如果不空,则表示括号不匹配。
这里我用的是链栈。由于不知道用户输入括号的长度,所以先让用户输入括号的个数,这样再申明一个数组。让用户将所有括号输入进去即可。
//括号匹配,使用链栈完成
#include<stdio.h>
#include <malloc.h>
#define ElemType char
#define array_length 50
typedef struct Node {
ElemType data;
Node* next;
}*LinkStack, Node;//链栈
LinkStack InitLinkStack() {
LinkStack Ls;
Ls = (LinkStack)malloc(sizeof(Node));
Ls->next = NULL;
return Ls;//返回头结点
}
void createLinkStack(LinkStack L, int num) {
ElemType Edata;
LinkStack assoL = L;//栈底的副本
Node* newL;
printf("请分别输入元素\n");
while (num > 0) {
scanf_s(" %c", &Edata);
newL = (Node*)malloc(sizeof(Node));
newL->next = NULL;
newL->data = Edata;
assoL->next = newL;//将新元素给栈顶
num--;
assoL = newL;
}
//assoL = L;
}
void printStack(LinkStack L) {
LinkStack assoL = L;//栈底的副本
if (assoL->next == NULL) {
printf("空栈\n");
}
while (assoL->next != NULL) {
assoL = assoL->next;
printf("%c ", assoL->data);
}
//assoL = L;
}
void push(LinkStack L, ElemType Edata) {
LinkStack assoL = L;//栈底的副本
while (assoL->next != NULL) {
assoL = assoL->next;
}//找到栈顶
Node* newL = (Node*)malloc(sizeof(Node));
newL->next = NULL;
newL->data = Edata;
assoL->next = newL;
//assoL = L;
}
void pop(LinkStack L) {
LinkStack assoL = L;//栈底的副本
if (assoL->next == NULL) {
printf("栈已空");
return;
}
while (assoL->next != NULL) {
if (assoL->next->next != NULL) {
assoL = assoL->next;
}
else {
assoL->next = NULL;
break;
}
}
}
//获取栈顶元素
ElemType getTop(LinkStack L) {
Node* assoL = L;
if (assoL->next == NULL) {
return assoL->data;
}
while (assoL->next != NULL) {
assoL = assoL->next;
}
return assoL->data;
}
bool isEmpty(LinkStack L) {
Node* assoL = L;
if (assoL->next == NULL) return true;
return false;
}
void doFunction(LinkStack L, char* arrays){
int i = 0;
while (arrays[i] != '\0') {
switch (arrays[i]) {
case '{':
case '[':
case '(':
push(L, arrays[i]);
break;
case ')':
case '}':
case ']':
if (getTop(L) == '(' && arrays[i] == ')' ||
getTop(L) == '[' && arrays[i] == ']' ||
getTop(L) == '{' && arrays[i] == '}') {
pop(L);
}
else {
push(L, arrays[i]);
}
break;
}
i++;
}
}
int main() {
LinkStack L = NULL;
int num = 0;
int in = 0;
int i = 0;
ElemType data = 0;
char Edata;
L = InitLinkStack();
printf("请输入括号的个数:\n");
scanf_s("%d", &num);
char arrays[array_length];
printf("请输入括号");
//录入字符串
for (i = 0; i < num; i++) {
scanf_s(" %c", &Edata);
arrays[i] = Edata;
}
arrays[i] = '\0';
doFunction(L, arrays);
if (isEmpty(L))
printf("括号匹配\n");
else
printf("括号不匹配\n");
}