#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
#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("%sn",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 != '') {
// 如果是左括号的话直接进栈
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;
}
原文地址:https://blog.csdn.net/qq_45973003/article/details/134783737
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_43610.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。