zoukankan      html  css  js  c++  java
  • 数据结构

    数据结构

    一、堆栈的应用:
      1、c++模板库:

          stack<int>s;

          在头文件#include<stack>,需要声明并且使用标准命名空间。

      2、括号匹配问题:

          

      3、计算表达式的值:

        其一般方法:

          (1)设立两个堆栈,一个用来保存运算符,一个用来保存数字。

          (2)在表达式首尾添加标记运算符,该运算符运算优先级最低。

          (3)从左至右依次遍历字符串,若遍历到运算符,将其与运算符栈栈顶元素进行比较,若运算符栈栈顶运算符小于该运算符      

    二、哈夫曼树:

      1、哈夫曼树的求法:

        (1)将所有的节点放入集合k。

        (2)若集合k中剩余节点大于2个,则取出其中权值最小的两个节点,构造他们同时为某个新节点的左右儿子,该节点是他们共同的双亲节点,设定他的权值为两个子节点的权值和。并将该父亲节点放入集合k,重复步骤2或3.

        (3)若节点中只有一个节点,则这个节点就是该树的根节点。

        在该例中,为了可以更快的取出元素,需要使用c++中的堆数据结构。为了绕过对堆的实现,我们使用标准模板库的相应标准模板----优先队列。

        建立一个保存元素为int 的堆q,但是特别注意建立的堆是默认为大顶堆,即我们从堆顶取得的元素为整个堆中的最大元素。而求哈夫曼树我们需要取得的元素是堆中的最小的元素,于是我们使用如下语句定义

    一个小顶堆:

        priority_queue<int,vector<int>,greater<int>> Q;

        关于堆的操作:

          Q.push(x),

          Q.top(),

          Q.pop()

          其在#include<queue>库中
        关于堆的具体实现

        

    #include<iostream>
    #include<queue>
    using namespace std;
    priority_queue<int,vector<int>,greater<int> >Q; 
    int main(){
        int n;
        while(scanf("%d",&n)==1){
            while(!Q.empty()) Q.pop();
            for(int i=0;i<n;i++){
                int k;
                scanf("%d",&k);
                Q.push(k);
            }
            int ans=0;
            while(Q.size()>1){
                int a=0;
                int b=0;
                a=Q.top();
                Q.pop();
                b=Q.top();
                Q.pop();
                ans+=a;
                ans+=b; 
                Q.push(a+b);
            }
            Q.pop();
            printf("%d
    ",ans);
        }
    }
    View Code

    三、二叉排序树:

      

    #include<cstdio>
    #include<stdlib.h>
    int a[100];
    struct Tree{
        int data;
         Tree* left;
         Tree* right;
    };
    //向树中插入元素 
    void insert(Tree* root,int i){
            if(root->data>i){
                if(root->left!=NULL){
                    insert(root->left,i);
                }else{
                    root->left=(Tree*)malloc(sizeof(Tree));
                    root->left->data=i;
                    root->left->left=NULL;
                    root->left->right=NULL;
                }
            }else{
                if(root->right!=NULL)
                insert(root->right,i);
                else{
                    root->right=(Tree*)malloc(sizeof(Tree));
                    root->right->data=i;
                    root->right->left=NULL;
                    root->right->right=NULL;
                }
            }
    }
    //中序打印树 
    void mid_print(Tree* root){
        if(root!=NULL){
            mid_print(root->left);
            printf("%d ",root->data);
            mid_print(root->right);
        }
    }
    int main(){
        int n;
        while(scanf("%d",&n)==1){
            for(int i=0;i<n;i++){
                scanf("%d",a+i);            
            }
            Tree* root=(Tree*) malloc(sizeof(Tree));
            root->data=a[0];
            root->left=NULL;
            root->right=NULL;
            for(int i=1;i<n;i++){
                insert(root,a[i]);
            }
            mid_print(root); 
            printf("
    ");
        }
    }
    View Code

      (2)判断两棵树是否相同:

          由树的知识可知,包括中序遍历在内的两种遍历结果可以唯一的确定一颗树,因此可以对两棵树进行两种遍历,若两种遍历结果都相同,则可以判定两棵树是完全相同的。

      

  • 相关阅读:
    POJ-图论-最短路模板(邻接矩阵)
    POJ-图论-并查集模板
    POJ-排序-归并排序与逆序对
    【题目自解】北京大学2018计算机学科夏令营上机考试
    【算法总结】图论-拓扑排序
    【算法总结】图论-最短路径
    【算法总结】图论-最小生成树
    【算法总结】图论-并查集
    iOS程序的生命周期
    6款好用的Python IDE
  • 原文地址:https://www.cnblogs.com/yangsongwei/p/8875454.html
Copyright © 2011-2022 走看看