栈的应用---编译器左右符号的语法匹配

        各位程序猿在写代码的时候,使用的编译器(如VisualStudio、Eclipse)都有左右括号的自动匹配功能,如果写错了,它就会即时编译,提示错误。

那么现在,就利用栈的特点就简单实现了这一功能。

可以实现基本‘ { ’、‘ [ ’、‘(’、‘ “ ’、‘ ‘ ’、’ < ‘的左右匹配功能。

基本实现思路:

1,将代码视为一条字符串,创建栈空间

2,遍历字符串,遇到左符号->压栈

3,遇到右符号,弹栈,弹出的左符号与右进行匹配

4,执行步骤2 ,直到遍历到'\0'(字符串结尾)


具体代码如下:

由于使用到了栈的代码,这里就不再次贴上栈的代码了,请参阅:栈的实现与操作(C语言实现) 。相关操作均已实现。


// 栈应用语法匹配.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "LinkStack.h"
#include <stdlib.h>
//判断是否为左符号
int isLeft(char  ch)
{
	int ret = 0;
	switch (ch)
	{
	case '{':
	case '(':
	case '[':
	case '\"':
	case '\'':
	case '<':
		ret = 1;
		break;
	default:
		ret = 0;
		break;
	}
	return ret;
}
//判断是否为右符号
int isRight(char c)
{
	int ret = 0;

	switch(c)
	{
	case '>':
	case ')':
	case ']':
	case '}':
	case '\'':
	case '\"':
		ret = 1;
		break;
	default:
		ret = 0;
		break;
	}

	return ret;
}
//匹配左右符号
int match(char left,char right)
{
	int ret = 0;
	switch (left)
	{
	case '{':
		ret = (right == '}');
		break;
	case '[':
		ret = (right == ']');
		break;
	case '(':
		ret = (right == ')');
		break;
	case '\"':
		ret = (right == '\"');
		break;
	case '\'':
		ret = (right == '\'');
		break;
	case '<':
		ret = (right == '>');
		break;
	default:
		ret = 0;
		break;
	}
	return ret;
}
//匹配算法
int matcher(const char * code)
{
	LinkStack * stack = LinkStack_Create();//创建栈
	int ret = 0;
	int i = 0;
	while (code[i] != '\0')
	{
		if(isLeft(code[i]))  //如果为左符号,就压栈
		{
			LinkStack_Push(stack, (void *)(code+i)) ;
		}//end 1 if
		if(isRight(code[i])) 
		{
			char * c = (char * )LinkStack_Pop(stack);//为右符号时,弹栈
			
			if ((NULL == c) || !match(*c,code[i])) //判断 匹配,如果遇到不匹配的,跳出循环
			{
				printf("%c does not match!\n", code[i]);
				ret = 0;
				break;
			}
		}//end 2 if
		i++;
	}//end while
	if ((LinkStack_Size(stack) == 0) && (code[i] == '\0')) //如果栈为空,且遍历到字符结尾,匹配成功 
	{
		printf("Success!");
		ret = 1;
	}
	else
	{
		printf("Invalid code !");
		ret = 0;
	}
	LinkStack_Destroy(stack);
	return ret;

}


int _tmain(int argc, _TCHAR* argv[])
{
	const char* code = "#include <stdio.h> 	int main() 	{printf(\"Hello World!\n\");} ";


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

运行结果:

Success!
请按任意键继续. . .



如有错误,望不吝指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值