CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

输入一个算术表达式,判断括号是否匹配

楼主dgdsfsd(dsfsfs)2003-12-03 14:58:26 在 C/C++ / C++ 语言 提问

写一程序判断  
  [(3+3)*3]匹配  
  [(9*2]不匹配  
   
  问题点数:60、回复次数:6Top

1 楼dgdsfsd(dsfsfs)回复于 2003-12-03 15:14:24 得分 0

用CTop

2 楼plainsong(短歌)()回复于 2003-12-03 15:14:37 得分 40

以前写过一个,是处理多行的,你自己改一下吧:  
  #include   <iostream>  
  #include   <fstream>  
  #include   <string>  
  #include   <stack>  
  #include   <ctime>  
   
   
  //---------------------------------------------------------------------------  
  using   std::cout;  
  using   std::endl;  
  using   std::ifstream;  
  using   std::string;  
  typedef   std::stack<char>   stack;  
   
  int   main(int   argc,   char*   argv[])  
  {  
      std::clock_t   __clock   =   std::clock();  
      ifstream   inf("e:\\utilcls.h");  
      int   LineNumber(0);  
      stack   Stack;  
      while(inf)  
      {  
  //         cout   <<   "Line   Number:"   <<   LineNumber   <<"..."   <<   endl;  
          string   Line;  
          getline(inf,   Line);  
          string::size_type   Pos   =   Line.find_first_of("([{)]}");  
          const   string::size_type   NPos   =   string::npos;  
          while(Pos   !=   NPos)  
          {  
              char   Ch   =   Line[Pos];  
              switch(Ch)  
              {  
              case   '(':  
              case   '[':  
              case   '{':  
                  Stack.push(Ch);  
                  break;  
              case   ')':  
                  if   (Stack.size()   ==   0   ||   Stack.top()   !=   '(')  
                  {  
                      cout   <<   "Error:"   <<   LineNumber   <<   ":"   <<   string(Line,   0,   Pos   +   1)   <<   endl;  
                      return   -1;  
                  }  
                  else  
                      Stack.pop();  
                  break;  
              case   ']':  
                  if   (Stack.size()   ==   0   ||   Stack.top()   !=   '[')  
                  {  
                      cout   <<   "Error:"   <<   LineNumber   <<   ":"   <<   string(Line,   0,   Pos   +   1)   <<   endl;  
                      return   -1;  
                  }  
                  else  
                      Stack.pop();  
                  break;  
              case   '}':  
                  if   (Stack.size()   ==   0   ||   Stack.top()   !=   '{')  
                  {  
                      cout   <<   "Error:"   <<   LineNumber   <<   ":"   <<   string(Line,   0,   Pos   +   1)   <<   endl;  
                      return   -1;  
                  }  
                  else  
                      Stack.pop();  
                  break;  
              }  
              Pos   =   Line.find_first_of("([{}])",   Pos   +1);  
          }  
          LineNumber   ++;  
      }  
      __clock   =   std::clock()   -   __clock;  
      cout   <<   double(__clock)   /   CLK_TCK   <<   endl;  
      std::cin.get();  
      return   0;  
  }  
  Top

3 楼plainsong(短歌)()回复于 2003-12-03 15:17:28 得分 0

少了一句:  
   
  #include   <iostream>  
  #include   <fstream>  
  #include   <string>  
  #include   <stack>  
  #include   <ctime>  
   
   
  //---------------------------------------------------------------------------  
  using   std::cout;  
  using   std::endl;  
  using   std::ifstream;  
  using   std::string;  
  typedef   std::stack<char>   stack;  
   
  int   main(int   argc,   char*   argv[])  
  {  
      std::clock_t   __clock   =   std::clock();  
      ifstream   inf("e:\\utilcls.h");  
      int   LineNumber(0);  
      stack   Stack;  
      while(inf)  
      {  
  //         cout   <<   "Line   Number:"   <<   LineNumber   <<"..."   <<   endl;  
          string   Line;  
          getline(inf,   Line);  
          string::size_type   Pos   =   Line.find_first_of("([{)]}");  
          const   string::size_type   NPos   =   string::npos;  
          while(Pos   !=   NPos)  
          {  
              char   Ch   =   Line[Pos];  
              switch(Ch)  
              {  
              case   '(':  
              case   '[':  
              case   '{':  
                  Stack.push(Ch);  
                  break;  
              case   ')':  
                  if   (Stack.size()   ==   0   ||   Stack.top()   !=   '(')  
                  {  
                      cout   <<   "Error:"   <<   LineNumber   <<   ":"   <<   string(Line,   0,   Pos   +   1)   <<   endl;  
                      return   -1;  
                  }  
                  else  
                      Stack.pop();  
                  break;  
              case   ']':  
                  if   (Stack.size()   ==   0   ||   Stack.top()   !=   '[')  
                  {  
                      cout   <<   "Error:"   <<   LineNumber   <<   ":"   <<   string(Line,   0,   Pos   +   1)   <<   endl;  
                      return   -1;  
                  }  
                  else  
                      Stack.pop();  
                  break;  
              case   '}':  
                  if   (Stack.size()   ==   0   ||   Stack.top()   !=   '{')  
                  {  
                      cout   <<   "Error:"   <<   LineNumber   <<   ":"   <<   string(Line,   0,   Pos   +   1)   <<   endl;  
                      return   -1;  
                  }  
                  else  
                      Stack.pop();  
                  break;  
              }  
              Pos   =   Line.find_first_of("([{}])",   Pos   +1);  
          }  
          LineNumber   ++;  
      }  
      if   (Stack.size()   >   0)    
          cout   <<   "Error:"   <<   Stack.top()   <<   endl;  
      __clock   =   std::clock()   -   __clock;  
      cout   <<   double(__clock)   /   CLK_TCK   <<   endl;  
      std::cin.get();  
      return   0;  
  }  
  原贴在这:  
  http://expert.csdn.net/Expert/TopicView1.asp?id=2441264Top

4 楼november5(void)回复于 2003-12-03 15:18:09 得分 10

设置三个计数器  
  int   c1   =   0;   //for   '('&')'  
  int   c2   =   0;   //for   '['&']'  
  int   c3   =   0;   //for   '{'&'}'  
  读到左半边+1,读到右半边-1  
  表达式输完,判断(c1==0)&&(c2==0)&&(c3==0)  
  不知对不对  
   
  Top

5 楼november5(void)回复于 2003-12-03 15:18:13 得分 10

设置三个计数器  
  int   c1   =   0;   //for   '('&')'  
  int   c2   =   0;   //for   '['&']'  
  int   c3   =   0;   //for   '{'&'}'  
  读到左半边+1,读到右半边-1  
  表达式输完,判断(c1==0)&&(c2==0)&&(c3==0)  
  不知对不对  
   
  Top

6 楼abitz(阿奈)(老婆永远是对的!)回复于 2003-12-03 15:18:27 得分 0

典型的栈的应用问题Top

相关问题

  • 正则表达式成对括号匹配问题
  • 正则表达式匹配
  • 算术表达式的正则表达式
  • 求vb.net算术表达式求值!
  • 正则表达式 ---- 模式匹配
  • 正则表达式的匹配问题
  • 怎么样去掉表达式中的括号?
  • switch语句后面括号内表达式有何限制?
  • 开方的算术表达式怎么写?
  • 用户自定义算术表达式的求解

关键词

  • std
  • clock
  • stack
  • cout
  • include

得分解答快速导航

  • 帖主:dgdsfsd
  • plainsong
  • november5
  • november5

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo