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

无限循环中~

楼主pdaliu(刘星)2005-01-28 21:29:45 在 C/C++ / C++ 语言 提问

#include   <iostream>  
  using   namespace   std;  
  class   Stack  
  {  
  public:  
          Stack();  
          string   push(string);  
          char   pop(string&);  
          int   Bors(char);  
  private:  
          string   inOP;  
          string   outB;  
  };  
   
  int   Stack::Bors(char   bVal)  
  {  
          switch(bVal)  
          {  
                  case   '#':  
                                  return   0;  
                  case   '+':   case   '-':  
                                  return   2;  
                  case   '*':   case   '/':  
                                  return   3;  
                  case   '^':  
                                  return   4;  
                  default   :  
                                  return   1;  
          }  
  }  
  Stack::Stack(){inOP="#";outB="";}  
  string   Stack::push(string   Sval)  
  {  
          string   temp;  
          int   i=0;  
          while(Sval[i])  
          {  
                  temp=Sval[i];  
                  i++;  
          switch   (temp[0])  
          {  
                  case   '+':   case   '-':   case   '*':   case   '/':  
                  {  
                                  if   (Bors(inOP[inOP.size()-1])<=Bors(temp[0]))  
                                                                  inOP+=temp[0];  
                                  else  
                                  {  
                                                                  while(Bors(inOP[inOP.size()-1])>Bors(temp[0]))//如果栈顶元素大于temp的话就出栈    
                                                                                  outB+=pop(inOP);  
                                                                  inOP+=temp[0];  
                                  }  
                                  break;  
                  }  
                  case   '(':  
                                  inOP+=temp[0];break;  
                  case   ')':  
                                  while(inOP[inOP.size()-1]!='(')  
                                                                  outB+=pop(inOP);  
                                  pop(inOP);  
                                  break;  
                  default:  
                                  outB+=temp;  
          }  
          }  
          while   (inOP[inOP.size()-1]!='#')  
                  outB+=pop(inOP);  
          Sval=outB;  
          return   Sval;  
  }  
  char   Stack::pop(string   &val)  
  {  
          char   chPop;  
          string   tempVal;  
                 
          chPop=val[val.size()-1];  
          for(int   i=0;i<val.size()-1;i++)  
                  tempVal+=val[i];  
          val=tempVal;  
  return   chPop;  
  }  
  int   main()  
  {  
  Stack   st;  
  string   abc;  
  int   i=0;  
   
  cout<<"请输入一个合法表达式:";  
  cin>>abc;  
  while   (st.push(abc)[i])  
  {  
          cout<<st.push(abc)[i]<<"   ";  
          i++;  
  }  
  system("pause");  
  return   0;  
  }  
  会出现无限循环!我是想让他输出每个字符中间有空格 问题点数:20、回复次数:13Top

1 楼dongyuanzhang(阿林)回复于 2005-01-28 21:47:18 得分 0

ctrl   +   dTop

2 楼pdaliu(刘星)回复于 2005-01-28 21:52:28 得分 0

啊?因为push会反回一个string型的字串,所以我认为是可以用[]的啊!为什么用不了啊1Top

3 楼paddy102(▄︻┻┳═一)回复于 2005-01-28 23:59:12 得分 0

cout<<"请输入一个合法表达式:";  
  cin>>abc;  
  while   (st.push(abc)[i])  
  {  
          cout<<st.push(abc)[i]<<"   ";  
          i++;  
  }  
   
  不断的调用st.push(abc),也就是重复往堆栈中填入字符串abc,while循环当然就不会停止了。所以这里的问题并非出在[]操作符上。  
  解决方法:  
          可以在堆栈定义中加入Peek()方法,检查堆栈中元素而不用像pop()一样弹出元素,觉得可以达到楼主的本来目的。Top

4 楼idau7((小i不怕)我爱Eva)回复于 2005-01-29 00:17:36 得分 0

支持   paddy102(▄︻┻┳═一)Top

5 楼zxs790501(沧海一粟)回复于 2005-01-29 12:10:08 得分 0

while   (st.push(abc)[i])  
  条件永远为true,哪能停下来啊?Top

6 楼pdaliu(刘星)回复于 2005-01-30 14:11:49 得分 0

但是如果再加一个string的变量如下:  
  int   main()  
  {  
  Stack   st;  
  string   abc,tem;  
  int   i=0;  
   
  cout<<"请输入一个合法表达式:";  
  cin>>abc;  
  tem=st.push(abc);  
  while   (tem[i])  
  {  
          cout<<tem[i]<<"   ";  
          i++;  
  }  
  system("pause");  
  return   0;  
  }  
   
  这样就可以了!是为什么啊!tem的值不就是push反回的吗?Top

7 楼UPCC(杂食动物)回复于 2005-01-30 20:10:41 得分 10

while   (st.push(abc)[i])只要while()里的条件为假就跳出循环了,假的条就有'\0',   0,   EOF,在这里体现为EOF(文件或……的结束),Ctrl   +   D就是输入EOF  
   
  这样就可以了!是为什么啊!tem的值不就是push反回的吗?  
  ----------------------------------------------------  
  字符串的末尾是'\0',就是假的条件了,当到这里是就跳出了Top

8 楼UPCC(杂食动物)回复于 2005-01-30 20:12:14 得分 0

第一个条件没有看清楚,说错了。Top

9 楼UPCC(杂食动物)回复于 2005-01-30 20:15:36 得分 0

st.push(abc)[i]这里的返回值没有空过啊!Top

10 楼zhengwei1984222(阿什坎迪.兄弟会之剑)回复于 2005-01-30 21:42:38 得分 0

中缀式传后缀式吧  
  程序本身没错  
  你是想输入一个表达式就打印一个结果吗?Top

11 楼pdaliu(刘星)回复于 2005-01-31 09:25:10 得分 0

tem的值不是和st.push的值完全等价于的吗?怎么st.push[i]没有空过啊?Top

12 楼chongzhou123(重舟)回复于 2005-01-31 11:14:11 得分 10

用Dev-C++编译调试一下就明白了的。  
  原来这段代码  
  while   (st.push(abc)[i])  
  {  
          cout<<st.push(abc)[i]<<"   ";  
          i++;  
  }  
  会在每次调用while语句的时候重新执行st.push(abc)[i],也就是说while语句的条件永远为真,不可能结束的。  
   
  而改成  
          tem=st.push(abc);  
          while   (tem[i])  
          {  
                  cout<<tem[i]<<"   ";  
                  i++;  
          }  
  则只调用了一次push,while语句在运行到字串结束的时候自然也就结束了。  
  Top

13 楼pdaliu(刘星)回复于 2005-01-31 21:23:59 得分 0

那每次调用push的反回值应该是一样的啊?  
   
  反回值是一样的还有i的值是在变化啊!Top

相关问题

  • 无限循环
  • 无限循环
  • 构造函数中的无限循环????
  • 按一下键盘,在VC中怎样退出无限循环--急用
  • 不新开线程如何用鼠标中断无限次循环while (TRUE)A?先谢谢了.
  • 请教数学高手 0.99999999999......(无限循环)=1????????????
  • 如何写无限循环程序(具体含义见内容)
  • 在线程里有无限循环时,好象不跳出循环就无法终止线程,是吗
  • 串口无限循环采集数据,不定期死机问题
  • 怎么才可以控制一个无限循环的暂停与继续?

关键词

  • inop
  • outb
  • sval
  • bors
  • stack
  • abc
  • pop
  • temp
  • case
  • val

得分解答快速导航

  • 帖主:pdaliu
  • UPCC
  • chongzhou123

相关链接

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

广告也精彩

反馈

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