数据结构之栈的应用--如何实现符号成对检测

本文介绍了如何利用栈来实现符号的成对检测,通过扫描字符,遇到左符号压栈,遇到右符号则与栈顶元素匹配。如果匹配成功则继续扫描,否则报错。最终,所有字符扫描完毕且栈为空表示成功,否则为失败。

一、算法思路

    1、从第一个字符开始扫描;

    2、当遇到普通字符时忽略,当遇到左符号时压入栈中;

    3、当遇到有字符时,从栈中弹出栈顶符号;

    4、进行匹配:

            ①匹配成功:继续读入下一个字符;

            ②匹配失败:立即停止,并报错;

    5、结束:

            ①成功:所有的字符扫描完毕,且栈为空。

            ②失败:匹配失败或所有的字符扫描完毕但栈非空。

二、算法框架:

scanner(string)
{
	创建栈S;
	i = 0;
	while( string[i] != '\0' )
	{
		if( string[i]为左符号 )
		{
			push(S,string[i]);
		}
		if(string[i]为右符号)
		{
			c = pop[S];
			
			if(c与string[i]不匹配)
			{
				报错,立即停止循环;
			}
		}
		
		i++;
	}
	
	if( (size(S) == 0) && (string[i] == '\0') )
	{
		匹配成功;
	}
	else
	{
		匹配失败,报错;
	}
}

三、代码实现:

#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"  //栈
#include "Scanner.h"

//判断是否为左符号
int Isleft(char c)
{
	int ret = 0;
	switch(c)
	{
		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 Ismatch(char right, char left)
{
	int ret = 0;
	switch(right)	
	{
		case '>' : 
			ret = (left == '<');
			break;
		case ')' :
			ret = (left == '(');
			break;
		case ']' :
			ret = (left == '[');
			break;
		case '}' :
			ret = (left == '{');
			break;
		case '\'' :
			ret = (left == '\'');
			break;
		case '\"' :
			ret = (left == '\"');
			break;
		default :
			ret = 0;
			break;
	}
	return ret;
}

int Scanner(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));
		if( Isright(code[i]) )
		{
			char* left = (char*)LinkStack_Pop(stack);
			if( (left == NULL) || !Ismatch(code[i], *left) )
			{
				printf("%c dose not match!\n", code[i]);
				ret = 0;
				break;
			}
		}
		i++;
	}
	if( (LinkStack_Size(stack) ==0) && (code[i]) == '\0' )
	{
		printf("Succeed!\n");
		ret = 1;
	}
	else
	{
		printf("Invialid\n");
		ret = 0;
	}

	LinkStack_Destroy(stack);
	return ret;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值