简单数据结构

现在写这篇博客似乎是怪怪的,其实前面果断都有用到,因为博客开得晚嘛,还是总结总结,也练练熟练吧。

队列,先进先出,可参考往两头不封口的管子里扔东西的情景

栈,先进后出,可参考往底下封口的管子里扔东西

前者先放进去的先掉出来,后者先放进去的最后取出来


写一个队列,像这样:

#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这东西~~感觉能手写一些简单的数据结构实现毕竟基本能力吧~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值