很多人都看过栈和队列了吧?那岂不是我没有说的意义了?那好,我就做这个记录,等我老了还可以给孙子学栈和队列,嘿嘿
栈和队列一个先进后出,一个先进先出,栈就是一个狗洞,你爬进去之后因为空间太小不许你翻身,所以想出来就的往后挪,当然要是有人用棍子顶住你菊花那你就出不去了,嘿嘿,队列就是你人品好一点,找到的这个狗洞的主人比较勤快,已经把洞挖通了,所以对面就是出口,但是你一进去之后狗狗就发现你了,跟狗抢洞,你不是找抽么?难道这时你还想你能往后挪?所以就拼命往前冲,神马算法啊,先一边去,保住菊花再说,这回先进后出跟先进先出你该有印象了吧?还没印象的话那我这流氓式教育还真是失败
栈和队列可以是使用STL里面的,也可以自己用数组模拟,根据具体功能,叫你模拟出一个栈或者队列,NTM别说你不行,是男人就不能说不行,那就跳过模拟了咯,直接介绍STL里面的,在STL里面有栈和队列,我是这样理解的,他们就是容器,和int一样,你能用int定义整形变量,我就能用stack和queue来定义栈和队列,然后你就想象有这么个空间,他的名字就是栈或者队列,然后对他的操作就只能是STL里面的那几个固定的函数,发现那句经典台词了没?自己想象有这么个东西,然后吃透各个函数的意义,那栈和队列还不被你搞死搞残啊?函数一共也就11个,当然我这里是介绍的基础的咯,队列还有双向队列和优先队列,这里先不讲,为什么?难道你硬要我告诉你我还不会?擦,那你大大滴不行啊!
我就先把函数都放这里咯,省得神经兮兮的人还要去找度娘的麻烦
栈:#include<stack>这个是定义的头文件,懂?
stack<INT> s;我定义一个INT类型的栈s,INT是随你的,你想栈里面装int就写int,double就写double,最好的一点,嘿嘿,还可以是结构体哦~~
s.empty()判断栈是否是空的,是空的就返回真,不然就是假,所以这个是常常用在if和while里面应该不用我说吧?
s.top()返回栈顶元素,你要写a=s.top()的话那么a就被赋值成栈顶元素了,懂?记住,只是返回,但不改变栈里面的内容,也就是没有删除栈顶元素
s.pop()刚刚说了不会删除,现在这个就是用来删除栈顶元素的,没有返回值,就直接单个单个的用就是了,不过可别对空栈用的,里面本来就没东西,你还要从里面丢出点东西来,NTM是不是成心的咯?
s.size()返回栈里面有多少元素,就是用来确定栈里面的元素数量的,要是我要求你不许 在栈里面放5个以上的元素,那你是不是就会用上他了咯?不过貌似也不用,嘿嘿,进栈就直接记录好了
s.push()进栈的函数啊,比如我要a进栈,我就直接写s.push(a);你懂用法了?不懂?NTM去死好不?
队列:#include <queue>这个是队列定义的头文件
queue<INT> q;这里的INT和栈一样的,别说需要我来给你讲解,自己看前面
q.empty(); q.pop(); q.size(); q.push();这些都是和栈一样的用法,别浪费表情~
q.back(); q.front();这两个是队列的的返回方式,这就是队列有6个函数而栈只有5个的原因,小子,学过English木有?back是后front是前,我翻译的没错吧?错了也不管了,记住,back是返回的队尾的元素,front是返回的队首的元素,用法和栈里面那个top一样,但是为什么队列不同top呢?我当时也纳闷,不过啊,嘿嘿,我提前告诉你,优先队列把他强奸了,所以top就是他的人了,top在优先队列里面用来返回优先级最高的元素,我没学,所以不多少,免得别人说我关公背后玩小刀
我的站和队列就over了列?还没懂?往左边看咯,是不是木有门?对了,再讲一遍----no door(自己合成的此,不知道语法对不^^!)
举个例子?
丫的好险好险,还好上传了一个,不然还的临时敲代码
栈:
愚人节的礼物
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3347 Accepted Submission(s): 2047
用()表示一个盒子,B表示礼物,Vayko想让你帮她算出愚人指数,即最少需要拆多少个盒子才能拿到礼物。
每组测试包含一个长度不大于1000,只包含'(',')'和'B'三种字符的字符串,代表Vayko设计的礼物透视图。
你可以假设,每个透视图画的都是合法的。
((((B)()))()) (B)
4 1
#include <iostream>
#include <cstring>
#include <stack> //我是想练习队列和栈来做它,这个题队列和栈一样可以做
using namespace std;
stack<int> s;
int main (void)
{
int i,j,k,l;
char a[1111];
while(cin>>a)
{
l=strlen(a);
for(i=0;i<l;i++)
if(a[i]=='(')
s.push(1); //是左括号就进栈一个1
else if(a[i]==')')
s.pop(); //是右括号就出栈一个
else break; //不是括号就可以结束了
i=0;
while(!s.empty()) //栈内是否为空
i++,s.pop(); //记录数加一个,出栈一个
cout<<i<<endl;
}
return 0;
}
妹妹的贴过来的就是丑啊,还是黑白电视机,我还以为我穿越回到解放前了咯!
队列:
士兵队列训练问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2567 Accepted Submission(s): 1160
2 20 40
1 7 19 1 19 37
#include <iostream>
#include <queue>
using namespace std;
queue<int> s;
void cmp(int k)
{
int i=1;
while(s.front()!=0)
{
if(i%k!=0) //把留下来的方队尾
s.push(s.front());
s.pop();i++; //去掉队首
}s.pop();s.push(0); //把队首的0去掉,在队尾加上0
}
int main (void)
{
int t,n,i,j,k,l;
cin>>t;
while(t--&&cin>>n)
{
for(i=1;i<=n;i++)
s.push(i);s.push(0); //每次在屁股加上个0
i=1;
while(s.size()>4) //因为加上了0,所以长度小于等于4就退出
{
if(i%2==0)cmp(3); //选择数三下踢一个人还是数两下踢一个人
else cmp(2);
i++;
}i=0;
while(!s.empty()) //查看队列中是不是为空
{
if(s.front()>0) //因为队尾还有个0,这个是不用输出的但是为了清空队列,还是要pop他
{
if(i)cout<<" ";i=1;
cout<<s.front();
}
s.pop();
}cout<<endl;
}
return 0;
}
哎~~改扯的扯完了列,亲爱的你会一点点了没咯?刚刚打字我消耗了很多查克拉耶~别让我徒劳无功啊