关于栈的困惑,希望各位给些帮助.
钱能的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 一个元素出来)