/****************************************************************************************************************************
*平衡符号匹配
*问题描述:检测 "(), [], {}" 是否匹配。
*数据结构:使用数组栈完成
*
*算法 :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.
括号匹配判断
最新推荐文章于 2023-08-26 21:28:15 发布