括号匹配判断

/****************************************************************************************************************************
*平衡符号匹配 
*问题描述:检测 "(), [], {}" 是否匹配。
*数据结构:使用数组栈完成 
* 
*算法    :1.左平衡符号直接入库              push(s,ch)
*          2.遇到右平衡符号:  
*             2.1 栈空                        error,break(1)
*             2.2 top(s)与当前符号不match     error,break(2)
*			  2.3 match                       pop(s)
*		   3.读完所有输入:
*		      3.1 栈非空                      error(3)
*			  3.2 栈空                        right
*author: fangchang 
*date:   2016/04/05 
*time:   11:00 
****************************************************************************************************************************/  

#include"arrayStack.h"
#include<stdio.h>

#define FILE_NAME  "test.txt" 

BOOL isLeftSymbol(int ch);
BOOL isRightSymbol(int ch);
BOOL isMatch(int left, int right);
void answer() ;

int main () {
	answer();
	fflush(stdin);
	getc(stdin);
	return 1;
}

void answer() {
	Stack s = createStack();                     //新建一个栈
	FILE * fp = fopen(FILE_NAME,"r");            //打开文件
	int ch;
	if(!fp ) {
		printf("open %s failed.\n",FILE_NAME);
		return ;
	}
	while(EOF!=(ch=getc(fp))) {                    //(按字符)读文件
		if(ferror(fp)) {
			printf("read %s has error.\n",FILE_NAME);
			return ;
		}
		if(isLeftSymbol(ch)) {                   //左平衡符号
			push(s,ch);
		}
		else if(isRightSymbol(ch)) {             //右平衡符号      
			if(isEmpty(s)) {                     //栈空,error
				printf("when %c accured, stack s is empty.\n",ch);
				return ;
			}
			else if(!isMatch(top(s),ch)) {        //不匹配,error
				printf("when %c accured, top(s) isnot match.\n",ch);
				return ;
			}
			pop(s);                                //匹配,pop()
		}

	} 
	if(!isEmpty(s)) {                              //读完文件后,栈非空,error
		printf("error.\n");
	}
	else {                                          //一切ok
		printf("all is OK.\n");
	}
	clearerr(fp);
	fclose(fp);
	deleteStack(s);
}


BOOL isLeftSymbol(int ch) {
	if('('==ch || '['==ch || '{'==ch) {
		return TRUE;
	}
	return FALSE;
}

BOOL isRightSymbol(int ch) {
	if(')'==ch || ']'==ch || '}'==ch) {
		return TRUE;
	}
	return FALSE;
}

BOOL isMatch(int left, int right) {
	if( ('('==left && ')'==right) ||  ('['==left && ']'==right)  ||  ('{'==left && '}'==right) ) {
		return TRUE;
	} 
	return false;
}
end.

                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值