段错误查找:写个括号错误查找的问题



//用栈来实现
//遇到左括号压栈
//遇到右括号弹栈.并匹配,若不匹配出错
//处理完后,若栈不位空,表示出错
//注意问题:
//1出栈时没有考虑堆栈下溢情形:类似")))"输入必然导致崩溃!

#<iostream>
# <cmath>
#<fstream>
# <stack>
# <list>

using std;// 在VC中c无法用ios::nocreate而用.h无法用exit

struct bracket
{
char bk;
row;
line;

}A={'{',0,0},B={'[',0,0},C={'(',0,0},a={'}',0,0},b={']',0,0},c={')',0,0};
dis=3;


{
stack <bracket, list<bracket> > istack;
bracket X;
row=1,line=0;

stream infile("f.cpp",ios::in/*|ios::nocreate*/);//定义输入文件流对象以输入方式打开磁盘文件f.cpp
(! infile)
{
cout<<"open error!"<<endl;
0;
//exit(1);
}
for( i=0;i<200;i)
{
X.bk=infile.get;
line;
(X.bk'"')

//////////////////////////////////////////////////////////////////

// 进栈前去掉" " ' '当作括号首先//想到infile.ignore(n'/*')跳过但无法计R各L

//用while{infile.ignore;line}

//又会在当引号里奇偶性会可能// 导致"被跳过没有终止条件对奇偶判//断显得复杂了
//用Continue结束实现
while(infile.get!='"')
{

continue;

line;

}



(X.bk39)

// infile.ignore(20,39);
while(infile.get!=39)
{
continue;
line;
}

(X.bk'\n')//回车时行加1列归0
{
row;
line=0;
}
(X.bkA.bk||X.bkB.bk||X.bkC.bk) //读到左括号进栈
{
X.row=row;
X.line=line;
istack.push(X);
}
//cout<<istack.size<<endl;
(X.bka.bk||X.bkb.bk||X.bkc.bk) //读到右括号出栈
{
(istack.size0) //栈为空时当前括号出错
{
cout<<X.bk<<" 坐标:"<<"x"<<row<<",y"<<line<<endl;
dis=3;
}

{
X.row=row;
X.line=line;

dis=fabs(X.bk-istack.top.bk);//

//当括号能匹配时出栈'('=40, ')'=42,'['=91,']'=93,'{'=123,'}'=125利用这个关系
(dis<=2) //
{ //
istack.pop; //匹配时出栈
} //

{
cout<<istack.top.bk<<" 坐标:"<<"x"<<istack.top

.row<<",y"<<istack.top.line<<endl;
cout<<X.bk<<" 坐标:"<<"x"<<row<<",y"<<line<<endl;
istack.pop;
}
}

}
}
(dis<=2&&istack.size0)
{
cout<<"It's OK!"<<endl;
0;
}
while(istack.size!=0)
{
cout<<istack.top.bk<<" 坐标:"<<"x"<<istack.top.row<<",y"<<istack.top

.line<<endl;
istack.pop;
}

infile.close;
0;
}
Tags:  中括号 去括号 大括号 段错误查找

延伸阅读

最新评论

发表评论