zoukankan      html  css  js  c++  java
  • 常用的简单数据结构:栈、队列、二叉堆

     

    栈:

      以先进后出的原则,先进栈的元素处于栈底,后进栈的元素处于栈顶,以一个指针作为标记就能很好的完成简单的入栈出栈操作 

    代码如下: 

    #include <stdio.h>

    #define N 10

    int Stack[N];//
    int Top;//栈顶指针

    void Stack_Push(int x)//入栈操作
    {
    Stack[Top++]=x;
    return;
    }

    void Stack_Pop()//出栈操作
    {
    printf("%d ",Stack[--Top]);
    return;
    }

    int main()
    {
    int i,num;
    for(Top=i=0;i<N;++i)
    {
    scanf("%d",&num);
    Stack_Push(num);
    }
    for(i=0;i<N;++i)
    {
    Stack_Pop();
    }
    puts("");
    return 0;
    }
    /*
    Input:
    9 7 8 5 6 10 4 2 1 3
    Output:
    3 1 2 4 10 6 5 8 7 9
    */

    队列:

         以先进先出的原则, 先进队列的元素处于队首,后进队列的元素处于队尾。  以一个队首指针一个队尾指针作为标记就能很好的完成简单的入队出队操作 
     代码如下:

    #include <stdio.h>

    #define N 10

    int Queue[N];//队列
    int Head,Tail;//队首指针,队尾指针

    void Queue_Push(int x)//入队操作
    {
    Queue[Tail++]=x;
    return;
    }

    void Queue_Pop()//出队操作
    {
    printf("%d ",Queue[Head++]);
    return;
    }

    int main()
    {
    int i,num;
    for(Head=Tail=i=0;i<N;++i)
    {
    scanf("%d",&num);
    Queue_Push(num);
    }
    for(i=0;i<N;++i)
    {
    Queue_Pop();
    }
    puts("");
    return 0;
    }
    /*
    Input:
    9 7 8 5 6 10 4 2 1 3
    Output:
    9 7 8 5 6 10 4 2 1 3
    */

    二叉堆:

        默认为最小堆,堆必须保证序列性(即父节点不大于左右子节点)。入堆时,先建立一个空节点,如果当前的节点的值比父节点的值小则使其父节点下沉,该节点上次,继续与父节点比较,直到比父节点大或者为根节点。出堆时,现在根处建立空节点,并将当前节点与其左右子节点比较,使得父节点小于左右子节点,一直往下一层找,直到超出当前堆大小,并记录当前能找到的最后一个节点(设为B),最后将堆里最后一个元素放到当前找到最后的地方(B)。

    代码如下:

    #include <stdio.h>

    #define N 10

    int Binary_Heap[N+1];//
    int Size;//堆大小

    void Binary_Heap_Push(int x)//入堆
    {
    int Now;
    Now=++Size;
    while(Now>1&&x<Binary_Heap[Now>>1])//搜索比当前要插入节点大的节点,并让这些节点下沉
    {
    Binary_Heap[Now]=Binary_Heap[Now>>1];
    Now>>=1;
    }
    Binary_Heap[Now]=x;//将节点放入当前合适的地方
    return;
    }

    void Binary_Heap_Pop()//出堆
    {
    int Min,Now,temp;
    printf("%d ",Binary_Heap[1]);
    Now=1;
    while((Now<<1)<=Size)
    {
    temp=Now<<1;//初始为左孩子小
    if((temp+1)<=Size&&Binary_Heap[temp]>Binary_Heap[temp+1])//如果右孩子更小
    {
    ++temp;
    }
    if(Binary_Heap[temp]<Binary_Heap[Size])//子节点上冒
    {
    Binary_Heap[Now]=Binary_Heap[temp];
    }
    else
    {
    break;
    }
    Now=temp;
    }
    Binary_Heap[Now]=Binary_Heap[Size];//将堆里最后一个元素放到当前找到最后的地方
    --Size;
    return;
    }

    int main()
    {
    int i,num;
    for(Size=i=0;i<N;++i)
    {
    scanf("%d",&num);
    Binary_Heap_Push(num);
    }
    for(i=0;i<N;++i)
    {
    Binary_Heap_Pop();
    }
    puts("");
    return 0;
    }
    /*
    Input:
    9 7 8 5 6 10 4 2 1 3
    Output:
    1 2 3 4 5 6 7 8 9 10
    */


     

  • 相关阅读:
    译:编程面试的10大算法概念汇总
    Android内存优化之封装九宫格
    Android Java 程序员必备开发工具
    译:如何成为一个通晓多种编程语言的程序员
    8大排序算法图文讲解
    Android酷炫实用的开源框架(UI框架)
    Android动态加载字节码
    利用无效字节码指令引发逆向工具崩溃(二)
    oracle 12c linux服务器启动监听
    oracle无主键去重方法
  • 原文地址:https://www.cnblogs.com/NoSoul/p/2400213.html
Copyright © 2011-2022 走看看