项目结构
项目头文件的代码或截图
头文件代码
#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;
}
项目的运行结果展示