就近匹配
在开发的过程中,我们常常遇到成对出现的符号,比如"(" 与")",如果算式中仅仅出现其中一个,则说明算式错误。运用栈一数据结构模型,可以很好进行匹配。 算法思路: 1、从第一个字符开始扫描 2、遇见普通字符时忽略 3、当遇见左括号时压入栈中 4、当遇见右括号时弹出返回栈顶元素,并进行匹配 5、匹配成功,进入下一个字符 6、匹配失败,立即停止并进行报错 7、结束: 成功:所有字符匹配完毕,且栈为空 失败:匹配失败或者所有字符扫描完毕但是栈为非空
代码
"seqStack.h"文件
包含了栈的模型结构与常用接口声名
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1024
typedef void * SeqStack;
SeqStack init_SeqStack();
void push_SeqStack(SeqStack stack, void * data);
void pop_SeqStack(SeqStack stack);
void * top_SeqStack(SeqStack stack);
int size_SeqStack(SeqStack stack);
int isEmpty_SeqStack(SeqStack stack);
void destroy_SeqStack(SeqStack stack);
"seqStack.c"文件
包含了栈的各自接口的实现,看不懂不了解栈模型的欢迎查看本栏数据结构-线性栈 数据结构 -链表栈
#include "seqStack.h"
struct SStack
{
void * data[MAX];
int m_Size;
};
SeqStack init_SeqStack()
{
struct SStack * myStack = malloc(sizeof(struct SStack));
if (myStack == NULL)
{
return NULL;
}
memset(myStack->data, 0, sizeof(void *)* MAX);
myStack->m_Size = 0;
return myStack;
}
void push_SeqStack(SeqStack stack, void * data)
{
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct SStack * mystack = stack;
if (mystack->m_Size == MAX)
{
return;
}
mystack->data[mystack->m_Size] = data;
mystack->m_Size++;
}
void pop_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return;
}
struct SStack * mystack = stack;
if (mystack->m_Size == 0)
{
return;
}
mystack->data[mystack->m_Size - 1] = NULL;
mystack->m_Size--;
}
void * top_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return NULL;
}
struct SStack * mystack = stack;
if (mystack->m_Size == 0)
{
return NULL;
}
return mystack->data[mystack->m_Size - 1];
}
int size_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return -1;
}
struct SStack * mystack = stack;
return mystack->m_Size;
}
int isEmpty_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return -1;
}
struct SStack * mystack = stack;
if (mystack->m_Size == 0)
{
return 1;
}
return 0;
}
void destroy_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return;
}
free(stack);
stack = NULL;
}
具体实现代码
#include "Proximity matching of stacks.h"
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "seqStack.h"
int isLeft(char * p)
{
return '('== *p;
}
int isRight(char * p)
{
return ')' ==* p;
}
void printError(char *str ,char *Msg ,char *pos)
{
printf("错误信息:%s\n",Msg);
printf("%s\n",str);
int mis_num = pos - str;
for (int i = 0; i <mis_num ; ++i) {
printf(" ");
}
printf("^\n");
}
void test01(){
char *str = "5+5*(6)+9/3*1-(1+3(";
char * p =str;
SeqStack myStack = init_SeqStack();
while (*p != '\0')
{
if (isLeft(p)){
push_SeqStack(myStack,p);
}
if (isRight(p))
{
if(size_SeqStack(myStack)>0)
{
pop_SeqStack(myStack);
}
else
{
printError(str,"右括号无法匹配左括号",p);
break;
}
}
p++;
}
while (size_SeqStack(myStack)>0)
{
printError(str,"左括号没有匹配到右括号", top_SeqStack(myStack));
pop_SeqStack(myStack);
}
destroy_SeqStack(myStack);
}
int main() {
test01();
return 0;
}
运行图例
|