首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于栈的困惑,希望各位给些帮助.该怎么解决

2012-03-04 
关于栈的困惑,希望各位给些帮助.钱能的C++上讲到栈这一节时,只是理论的讲了栈的原理,实际的代码操作实现都

关于栈的困惑,希望各位给些帮助.
钱能的C++上讲到栈这一节时,只是理论的讲了栈的原理,实际的代码操作实现都没有讲,一笔代过,只留下一个排车厢顺序的例子,看了一整天也看不懂,例子如下:
#include   <iostream>
#include   <fstream>
#include   <sstream>
#include   <stack>
using   namespace   std;
int   main()
{ifstream   in( "rail.txt ");
  for(int   n,line=0;in> > n&&n&&in.ignore();)
  {cout < <line++? "\n ": " ";
      for(string   s;getline(in,s)&&s!= "0 ";)
          {istringstream   sin(s);
            stack <int>   st;
              for(int   last=0,coach;sin> > coach;st.pop())
                  {for(int   p=last+1;p <=coach;p++)   st.push(p);
                    if(last <coach)   last=coach;
                    if(st.top()!=coach)   break;
                    }
                cout < <(!sin? "yes\n ": "no\n ");
          }
    }
}
rail.txt:
5
3   2   1   5   4
5   4   1   2   3
0
6
6   5   4   3   2   1  
0
0
运行结果为:
yes
no


yes
这个程序里的pop()前面刚刚定义了一个stack,什么都没有往栈里压,pop个什么劲呀,
还设了一个last变量实在不明白作者什么意思,因此导致后面根本看不懂了,看了一整天,直看到用头撞墙n回,实在受不了了,希望各位前辈帮帮我,给我解释一下这个程序,尤其是stack <int>   st;
              for(int   last=0,coach;sin> > coach;st.pop())
                  {for(int   p=last+1;p <=coach;p++)   st.push(p);
                    if(last <coach)   last=coach;
                    if(st.top()!=coach)   break;
                    }
                cout < <(!sin? "yes\n ": "no\n ");
这段,不胜感激,最好能把以后可能经常用到的栈函数告我一些,先谢谢拉.

[解决办法]
for(int last=0,coach;sin> > coach;st.pop())
{for(int p=last+1;p <=coach;p++) st.push(p);

其他部分代码不看了,
就这两句:
for(int last=0,coach;sin> > coach;st.pop())
这里的 pop 是在 for 循环体每次执行完后才执行的语句,
要注意在 循环体中是 {for(int p=last+1;p <=coach;p++) st.push(p); ...
这里有 push 丫 ~~

也就是说,
程序是 for 的循环体中先 push 入栈,执行了若干次 push 后完成循环体,执行for第三个语句,也就是 pop, 自然是有元素可以被 弹出的嘛
(请注意for 循环体又是一个 for 循环体,
也就是说, push X 个元素才 pop 一个元素出来)

热点排行