用的我自己手写的栈库来做的检测字符串里的左右括号是否匹配的一个小程序。
# ifndef LINKSTACK_H
# define LINKSTACK_H
# include <stdio.h>
# include <string.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* Top_LinkStack(LinkStack* stack);
//返回栈元素的个数
int Size_LinkStack(LinkStack* stack);
//清空栈
void Clear_SeqStack(LinkStack* stack);
//销毁
void FreeSpace_SeqStack(LinkStack* stack);
# endif
# include "LinkStack.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* Top_LinkStack(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_SeqStack(LinkStack* stack)
{
if(stack == NULL)
{
return ;
}
stack->head.next = NULL;
stack->size = 0;
}
//销毁
void FreeSpace_SeqStack(LinkStack* stack)
{
if(stack == NULL)
{
return ;
}
}
# include "LinkStack.h"
//检测括号是否匹配
/*
扫描字符串如果碰到左括号直接入栈,如果碰到右括号直接从栈顶
弹出括号,判断是否是左括号。如果是匹配成功,如果不是就匹配失败。
*/
typedef struct MYCHAR
{
LinkNode node;
char* pAddres;
int index;
}MyChar;
int IsLeft(char c)
{
return c == '(';
}
int IsRight(char c)
{
return c == ')';
}
MyChar* CreateChar(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("↑");
}
int main(int argc, char *argv[])
{
// char * str = "# include <stdio.h> int main() {int a[4][4]}; int (*P)[4]; p = a[0]; r eturn 0;";
char * str = "1 + 2 + 6(dsf)dfs(flp(sdfs)";
//创建栈容器
LinkStack* stack = Init_LinkStack();
char *p = str;
int index = 0;
while(*p != '\0')
{
//如果左括号 直接进栈
if(IsLeft(*p))
{
// MyChar* mychar = (MyChar*)malloc(sizeof(MyChar));
Push_LinkStack(stack, (LinkNode*)CreateChar(p, index));
}
//如果是右括号,从栈顶弹出元素 判断是不是左括号
if(IsRight(*p))
{
if(Size_LinkStack(stack) > 0)
{
MyChar* mychar = (MyChar*)Top_LinkStack(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*)Top_LinkStack(stack);
printf("左括号没有匹配的右括号:\n");
ShowError(str, mychar->index);
Pop_LinkStack(stack);
free(mychar);
}
printf("\n");
return 0;
}
//改成这样
char * str = "1 + 2 + 6(dsf)dfs)flp(sdfs)";
我这个在测验的时候发现如果是中文左括号就检测不出来,只能是英文,这个也好解决,加入一个判断机制,如果是中文的报错,但是我就懒得写了,后来参考的人可以写一下,也可以跟我交流