运用栈解决括号匹配的算法如下
栈的定义以及基本操作头文件-----------------------StackList.h
typedef char ElemType;
/* 链栈结构体 */
typedef struct ListNode{
ElemType data;
struct ListNode *next;
}ListNode,*ListStack;
/* 初始化操作 */
int init(ListStack *stack)
{
(*stack) = (ListNode *)malloc(sizeof(ListNode));
if ((*stack) == NULL)
return -1;//分配内存失败
(*stack)->next = NULL;
return 1;
}
/* 输出操作 */
void display(ListStack stack)
{
ListNode *p = stack->next;
if (p == NULL)
printf("该链栈为空!不能进行输出操作\n");
int i = 0;
while (p != NULL)
{
printf("stack[%d] = %d\n",i,p->data);
i++;
p = p->next;
}
}
/* 判空操作 */
int isEmpty(ListStack stack)
{
ListNode *p = stack->next;
if (p == NULL)
return 1;//链栈为空
else
return -1;//非空
}
/* 销毁操作 */
void destoryStack(ListStack *stack)
{
ListNode *now = (*stack)->next; //栈顶开始
ListNode *temp = NULL;
while (now != NULL)
{
temp = now->next;
free(now);
now = temp;
}
free(*stack); //释放头节点
(*stack) = NULL;//头指针置空
}
/* 入栈操作 */
int push(ListStack *stack,ElemType x)//栈的特性,只允许在栈顶插入,栈顶删除
{
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
if (p == NULL)
return -1;//内存分配失败;
p->data = x;
p->next = (*stack)->next; //入栈
(*stack)->next = p; //更新头节点
return 1;
}
/* 取栈顶操作 */
int peek(ListStack stack,ElemType *num)
{
if (stack->next == NULL)
return -1;//空栈
else
*num = stack->next->data;
return 1;
}
/* 出栈操作 */
int pop(ListStack *stack,ElemType *popNum)
{
if ((*stack)->next == NULL)
return -1;//空栈
else{
ListNode *p = (*stack)->next;
*popNum = p->data;
(*stack)->next = p->next;
free(p);
}
return 1;
}
函数主体----------------------------括号匹配算法
#include<stdio.h>
#include<stdlib.h>
#include"StackList.h" //到处栈相关操作的包
/* 括号匹配算法 */
int bracketCheck(char str[],int length)
{
ListStack stack;
init(&stack);
for(int i=0;i<length;i++)
{
if (str[i] == '(' || str[i] == '[' || str[i] == '{')
push(&stack,str[i]);//遇到左括号则入栈
else{
//遇到右括号
if (isEmpty(stack)==1)//isEmpty函数中栈空返回1
return -1;//栈空,不匹配退出程序
char topElem;
pop(&stack,&topElem);//栈非空,栈顶元素出栈
//检查左右括号是否匹配,不匹配返回-1
if (str[i] == ')' && topElem != '(')
return -1;
if (str[i] == ']' && topElem != '[')
return -1;
if (str[i] == '}' && topElem != '{')
return -1;
}
}
return isEmpty(stack)==1 ? 1 : -1;
}
/* 主函数 */
int main() {
printf("请输入你的括号序列长度:\n");
int length;
scanf("%d", &length);
// 动态分配内存
char *str = (char *)malloc(length * sizeof(char));
if (str == NULL) {
printf("内存分配失败!\n");
return -1;
}
printf("请输入括号序列:\n");
getchar(); // 清空输入缓冲区
for (int i = 0; i < length; i++) {
scanf(" %c", &str[i]); // 使用 " %c" 跳过空白符
}
int flag = bracketCheck(str, length);
if (flag == 1)
printf("匹配\n");
else
printf("不匹配\n");
free(str); // 释放动态分配的内存
return 0;
}
运行结果如下图所示: