使用栈解决括号匹配问题(详解)

项目结构
在这里插入图片描述项目头文件的代码或截图
在这里插入图片描述头文件代码

#ifndef LINKSTACK_H
#define LINKSTACK_H
#include <stdio.h>
#include <stdlib.h>
// 链式栈的节点
typedef struct LINKNODE {
   
	struct LINKNODE* next;
}LinkNode;
// 链式栈
typedef struct LINKSTACK {
   
	LinkNode head;
	int size;

}LinkStack;


// 初始化函数
LinkStack* Init_LinkStack();
// 入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data);
// 出栈
void Pop_LinkStack(LinkStack* stack);
// 返回栈顶元素
LinkNode* TopLinkStack(LinkStack* stack);
// 返回栈元素的个数
int Size_LinkStack(LinkStack* stack);
// 清空栈
void Clear_LinkStack(LinkStack* stack);
// 销毁栈
void FreeSpace_LinkStack(LinkStack* stack);
#endif

项目cpp文件代码与截图
在这里插入图片描述项目的代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "QueueStorage.h"

// 初始化函数
LinkStack* Init_LinkStack() {
   
    LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));
    stack->head.next = NULL;
    stack->size = 0;
    return stack;
};
// 入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data) {
   
    if (stack == NULL) {
   
        return;
    }
    if (data == NULL) {
   
        return;
    }
    // 入栈
    data->next = stack->head.next;
    stack->head.next = data;
    stack->size++;
};
// 出栈
void Pop_LinkStack(LinkStack* stack) {
   
    if (stack == NULL) {
   
        return;
    }
    if (stack->size == 0) {
   
        return;
    }

    // 第一个有效节点
    LinkNode* pNext = stack->head.next;
    stack->head.next = pNext->next;
    stack->size--;



};
// 返回栈顶元素
LinkNode* TopLinkStack(LinkStack* stack) {
   
    if (stack == NULL) {
   
        return NULL;
    }
    if (stack->size == 0) {
   
        return NULL;
    }
    // 返回栈顶元素
    return stack->head.next;
};

// 返回栈元素的个数
int Size_LinkStack(LinkStack* stack) {
   
    if (stack == NULL) {
   
        return -1;
    }
    return stack->size;
};
// 清空栈
void Clear_LinkStack(LinkStack* stack) {
   
    if (stack == NULL) {
   
        return;
    }
    // 清空栈
    stack->head.next = NULL;
    stack->size = 0;

};
// 销毁栈
void FreeSpace_LinkStack(LinkStack* stack) {
   
    if (stack == NULL) {
   
        return;
    }
    free(stack);
};

项目主文件代码或截图
在这里插入图片描述项目主文件代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "QueueStorage.h"

// 企业链表中的栈可以定义链表的小节点
typedef struct MYCHAR {
   
	LinkNode node;
	char* pAddres;
	int index;
}MyChar;

int IsLeft(char c) {
   
	return c == '(';
}
int IsRight(char c) {
   
	return c == ')';
}
MyChar* CreateMyChar(char* p,int index) {
   
	MyChar* mychar = (MyChar*)malloc(sizeof(MyChar));
	mychar->pAddres = p;
	mychar->index = index;
	return mychar;
}
void ShowError(char* str,int pos) {
   
	printf("%s\n",str);
	for (int i = 0; i < pos; i++) {
   
		printf(" ");
	}
	printf("A");
}

int main()
{
   
	// 扫描字符串如果碰到左括号直接入栈,如果碰到右括号从栈顶弹出括号,判断是不是左括号,如果是匹配成功
	char* str =(char*) "1(+2+)))3(dsf)dfsf((sgdf)))";
	// 创建栈容器
	LinkStack* stack = Init_LinkStack();
	char* p = str;
	int index = 0;
	// 扫描
	while (*p != '\0') {
   
		// 如果是左括号的话直接进栈
		if (IsLeft(*p)) {
   
			Push_LinkStack(stack,(LinkNode*)CreateMyChar(p,index));
		}
		// 如果是右括号,从栈顶弹出元素,判断是不是左括号
		if (IsRight(*p)) {
   
			if (Size_LinkStack(stack) > 0) {
   
				MyChar* mychar = (MyChar*)TopLinkStack(stack);
				if (IsLeft(*(mychar->pAddres))) {
   
					Pop_LinkStack(stack);
					free(mychar);
				}
			
			}
			else {
   
				printf("右括号没有匹配的左括号:\n");
				ShowError(str, index);
				break;
			}

		}
		p++;
		index++;
	}
	while (Size_LinkStack(stack) > 0) {
   
		 MyChar* mychar = (MyChar*)TopLinkStack(stack);
		 printf("左括号没有匹配的右括号:\n");
		 ShowError(str,mychar->index);
		 Pop_LinkStack(stack);
		 free(mychar);

	}
	printf("\n");
	system("pause");
	return 0;
}

项目的运行结果展示
在这里插入图片描述

相关推荐

  1. ----7-9 括号匹配

    2023-12-08 14:20:07       24 阅读
  2. 的简单应用:括号匹配

    2023-12-08 14:20:07       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 14:20:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 14:20:07       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 14:20:07       82 阅读
  4. Python语言-面向对象

    2023-12-08 14:20:07       91 阅读

热门阅读

  1. harmonyOS学习笔记之@Styles装饰器与@Extend装饰器

    2023-12-08 14:20:07       51 阅读
  2. HDFS常见题

    2023-12-08 14:20:07       49 阅读
  3. 非常抱歉的通知

    2023-12-08 14:20:07       59 阅读
  4. 我的记事本

    2023-12-08 14:20:07       51 阅读
  5. 【1day】DocCms 某接口SQL注入漏洞学习

    2023-12-08 14:20:07       60 阅读
  6. 诊断抗体抗原原料——博迈伦生物

    2023-12-08 14:20:07       50 阅读
  7. 快速排序的新用法

    2023-12-08 14:20:07       64 阅读
  8. Leetcode 349. Intersection of Two Arrays

    2023-12-08 14:20:07       50 阅读