VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 700|回复: 3

关于栈的困惑,希望各位给些帮助.

[复制链接]

3

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-2-17 23:00:01 | 显示全部楼层 |阅读模式
钱能的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");
这段,不胜感激,最好能把以后可能经常用到的栈函数告我一些,先谢谢拉.
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-4-21 22:45:01 | 显示全部楼层
多层循环哪 ~~
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-4-22 09:45:01 | 显示全部楼层
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 一个元素出来)
回复

使用道具 举报

3

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-7-6 11:15:01 | 显示全部楼层
谢谢了!可是输入第一行数据5和第五行数据6为什么结果不输出yes呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表