现在写这篇博客似乎是怪怪的,其实前面果断都有用到,因为博客开得晚嘛,还是总结总结,也练练熟练吧。
队列,先进先出,可参考往两头不封口的管子里扔东西的情景
栈,先进后出,可参考往底下封口的管子里扔东西
前者先放进去的先掉出来,后者先放进去的最后取出来
写一个队列,像这样:
#include<stdio.h>
#include<string.h>
int queue[5000];
int main()
{
int n,front,rear;
int flag=0;
scanf("%d",&n);
for(int i=0;i<n;i++)//初始化队列
queue[i]=i+1;
front=0;rear=n;//队首,队尾的指针
while(front<rear)
{
printf("%d",queue[front++]);//输出并抛弃队首
queue[rear++]=queue[front++];//队首移到队尾
}
return 0;
}
看了代码有没有猜出题意~从队首取两个元素,一个扔掉,一个放到队尾,输出的是扔掉了哪些元素~
再来一发栈的
#include<stdio.h>
int maxn=1010,n;
int main()
{
int target[maxn];
while(scanf("%d",&n)!=EOF)
{
int stack[maxn],top=0;//定义栈,栈顶指针
int A=1,B=1;
for(int i=1;i<=n;i++)scanf("%d",&target[i]);
int ok=1;
while(B<=n)
{
if(A==target[B]){A++;B++;}
else if(top&&stack[top]==target[B]){top--;B++;}//出
else if(A<=n)stack[++top]=A++;//入栈
else {ok=0;break;}
}
printf("%s\n",ok?"yes":"no");
}
return 0;
}
另外有个要区分一下的东西,数据结构也就是本文中所说的栈,和内存分配中所说的栈是不一样的,当然还有堆也是。两个不同地方的概念~
顺带也说说堆,下面这段前辈的话感觉挺到位的。
堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。
数据结构说来不易,其实!c++里的强大无比的stl都有。。
stl是个库,具体有啥
附上上面的队列和栈的stl实现版,可读性高了不少,push是入,pop是出,具体更多的可百度~
#include<stdio.h>
#include<queue>
using namespace std;
queue<int> q;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
q.push(i+1);
while(!q.empty())
{
printf("%d",q.front());
q.pop();
q.push(q.front());
q.pop();
}
return 0;
}
#include<stdio.h>
#include<stack>
using namespace std;
int maxn=1010;
int main()
{
int n;int target[maxn];
while(scanf("%d",&n)!=EOF)
{
stack<int> s;
int A=1,B=1;
for(int i=1;i<=n;i++)
scanf("%d",&target[i]);
int flag=1;
while(B<=n)
{
if(A==target[B]){A++;B++;}
else if(!s.empty()&&s.top()==target[B])
{
s.pop();
B++;
}
else if(A<=n)
s.push(A++);
else {flag=0;break;}
}
printf("%s",flag?"yes":"no");
}
return 0;
}
怎么说呢,stl这东西~~感觉能手写一些简单的数据结构实现毕竟基本能力吧~