括号错误查找的问题
来源:优易学  2011-12-15 12:09:15   【优易学:中国教育考试门户网】   资料下载   IT书店
  用栈来实现
  遇到左括号压栈,遇到右括号弹栈。并匹配,若不匹配出错;处理完后,若栈不位空,表示出错。
  注意问题:
  出栈时没有考虑堆栈下溢的情形:类似"())))"的输入必然导致程序崩溃!
  #include<iostream>
  #include <cmath>
  #include<fstream>
  #include <stack>
  #include <list>
  using namespace std;// 在VC中c++无法用ios::nocreate,而用.h无法用exit
  struct bracket
  {
  char bk;
  int row;
  int line;
  }A={’{’,0,0},B={’[’,0,0},C={’(’,0,0},a={’}’,0,0},b={’]’,0,0},c={’)’,0,0};
  int dis=3;
  int main()
  {
  stack <bracket, list<bracket> > istack;
  bracket X;
  int row=1,line=0;
  ifstream infile("f.cpp",ios::in/*|ios::nocreate*/);//定义输入文件流对象,以输入方式打开磁盘文件f.cpp
  if(! infile)
  {
  cout<<"open error!"<<endl;
  return 0;
  //exit(1);
  }
  for(int i=0;i<200;i++)
  {
  X.bk=infile.get();
  line++;
  if(X.bk==’"’)
  // 进栈前去掉" " ’ ’的当作字符的括号首先//氲絠nfile.ignore(n,’/*’),跳过。
  //用while(){infile.ignore();line++},
  //又会在当引号里字符奇偶性会可能// 导致"被跳过,没有终止条件,青年人网提示对奇偶判//断显得复杂了
  //用Continue结束实现
  while(infile.get()!=’"’)
  {
  continue;
  line++;
  }
  if(X.bk==39)
  // infile.ignore(20,39);
  while(infile.get()!=39)
  {
  continue;
  line++;
  }
  if(X.bk==’\n’)//字符回车时行加1,列归0
  {
  row++;
  line=0;
  }
  if (X.bk==A.bk||X.bk==B.bk||X.bk==C.bk) //读到左括号进栈
  {
  X.row=row;
  X.line=line;
  istack.push(X);
  }
  //cout<<istack.size()<<endl;
  if(X.bk==a.bk||X.bk==b.bk||X.bk==c.bk) //读到右括号出栈
  {
  if(istack.size()==0) //栈为空时当前括号出错
  {
  cout<<X.bk<<" 坐标:"<<"x"<<row<<",y"<<line<<endl;
  dis=3;
  }
  else
  {
  X.row=row;
  X.line=line;
  dis=fabs(X.bk-istack.top().bk);//
  //当括号能匹配时出栈’(’=40, ’)’=42,’[’=91,’]’=93,’{’=123,’}’=125利用这个关系
  if(dis<=2) //
  { //
  istack.pop(); //匹配时出栈
  } //
  else
  {
  cout<<istack.top().bk<<" 坐标:"<<"x"<<istack.top
  ().row<<",y"<<istack.top().line<<endl;
  cout<<X.bk<<" 坐标:"<<"x"<<row<<",y"<<line<<endl;
  istack.pop();
  }
  }
  }
  }
  if(dis<=2&&istack.size()==0)
  {
  cout<<"It’s OK!"<<endl;
  return 0;
  }
  while(istack.size()!=0)
  {
  cout<<istack.top().bk<<" 坐标:"<<"x"<<istack.top().row<<",y"<<istack.top
  ().line<<endl;
  istack.pop();
  }
  infile.close();
  return 0;
  }

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训