您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> C十十 >> 辅导 >> 正文    
  C++技巧(写个括号错误查找的问题) 【注册男护士专用博客】          

C++技巧(写个括号错误查找的问题)

www.nanhushi.com     佚名   不详 

  //用栈来实现
  //遇到左括号压栈
  //遇到右括号弹栈.并匹配,若不匹配出错
  //处理完后,若栈不位空,表示出错
  //注意问题:
  //1。出栈时没有考虑堆栈下溢的情形:类似"())))"的输入必然导致程序崩溃!
  #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=='"')
  //////////////////////////////////////////////////////////////////
  // 进栈前去掉" " ' '的当作字符的括号首先//想到infile.ignore(n,'/*'),跳过,但无法计R各L,
  //用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);//
  //Examda提示:当括号能匹配时出栈'('=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;
  }

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。