个人学习编程(3-24) 数据结构

括号的匹配:

if((si==')' && now=='(') || (si==']' && now=='[')){

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

int main() {
    char s[300];
    scanf("%s",&s);
    int i;
    int len = strlen(s);
    stack <char> st;
    for (i = 0; i < len; i++)
    {
        if(!st.empty()){
            char now = st.top();
            if((s[i]==')' && now=='(') || (s[i]==']' && now=='[')){
                st.pop();
            }
            else{
                st.push(s[i]);
            }
        }
        else{
            st.push(s[i]);
        }
    }
    if (!st.empty())
    {
        printf("NO!");
    }
    else{
        printf("GOOD!");
    }
    return 0;
}

哈夫曼树(果堆排序):

有n堆果子,看看如何分类

输入包括两行:第一行是一个整数n(1<=n<=10000),表示果子的种类个数。

第二行包含了n个整数,用空格分隔,第i个整数表示整数ai(1<=ai<=20000)是第i堆果子的数目。

eg:输入 3

1 2 9

输出:15

解法1:

如果数量比较少,可以用sort函数来排序,每次将前面两位加完之后继续排,继续加,直到数组只有一个值。

解法2:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

struct node{
    int x;
    node(int a) {x = a;} //构造函数方便赋值
};

//定义优先队列的排序:
bool operator < (const node& a,const node& b){
    return a.x > b.x;
}

int main(){
    priority_queue <node> q;
    int n,x;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
         cin >> x;
         q.push(x);
    }
    int ans = 0;
    while (q.size() > 1)
    {
        node num1 = q.top();
        q.pop();
        node num2 = q.top();
        q.pop();
        ans += (num1.x + num2.x);
        q.push(node{num1.x + num2.x});
    }
    cout << ans;
    return 0;
    
}

其中的q.push(node{num1.x + num2.x}) 是前面把num1 出队和num2出队之前,把他们的值保存下来再相加

二叉树的建立和遍历:

按照先序先输入 二叉树的节点,没有的按0表示。

再输出 第一行是先序 第二行是中序 第三行是后序变量 第四输出叶子结点

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

typedef struct node{ //注意typedef不能忽略
    char data;
    struct node *lchild,*rchild;
}*BitTree;
//先序遍历的方式创建二叉树:
void CreatBitTree(BitTree &T){
    char c;
    cin >> c;
    if(c == '0'){
        T=NULL;
    }
    else{
        T = new node;
        T->data = c;
        CreatBitTree(T->lchild);
        CreatBitTree(T->rchild);
    }
}

//将二叉树按照先序输出:
void PreOrderTraverse(BitTree T){
    if(T != NULL){
        cout << T->data << ' ';
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

//将二叉树按照中序输出:
void InOrderTraverse(BitTree T){
    if (T != NULL)
    {
        InOrderTraverse(T->lchild);
        cout << T->data << ' ';
        InOrderTraverse(T->rchild);
    }
}

//将二叉树按照后序输出:
void PostOrderTraverse(BitTree T){
    if (T != NULL)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout << T->data << ' ';
    }
    
}

//二叉树的叶子节点数:
int Leaf(BitTree T){
    if(T == NULL) return 0;
    if(T->rchild == NULL && T->lchild == NULL) return 1;
    return Leaf(T->lchild) + Leaf(T->rchild);
}

//二叉树的深度:
int Deepth(BitTree T){
    if (T == NULL) return 0;
    int x = Deepth(T->lchild);
    int y = Deepth(T->rchild);
    return max(x,y) + 1;
}

int main() {
    BitTree T;
    CreatBitTree(T);
    PreOrderTraverse(T); cout << endl;
    InOrderTraverse(T); cout << endl;
    PostOrderTraverse(T); cout << endl;
    cout << Leaf(T) << endl;
    return 0;
}
相关推荐
QN1幻化引擎10 分钟前
Dalin L — 我造了一门支持中文编程的语言,完整移植到 Rust 了
人工智能·算法·机器学习
Rainy Blue88311 分钟前
C转C++速成
c语言·c++·算法
txzrxz24 分钟前
二分图详解
数据结构·c++·算法·图论·深度优先搜索·二分图染色
天选之子12325 分钟前
DuckDB学习
jvm·学习
一只小菜鸡..1 小时前
Stanford CS144 学习笔记 (四):网络拥塞控制与 AIMD 算法
网络·笔记·学习
gaosushexiangji1 小时前
数字图像相关DIC系统在结构振动模态测量中的应用
算法
KaMeidebaby1 小时前
卡梅德生物技术快报|如何制备单克隆抗体:小众禽类靶点单抗制备实操流程:双载体抗原交叉筛选完整工艺记录
人工智能·python·深度学习·算法·机器学习
xuhaoyu_cpp_java2 小时前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
北域码匠2 小时前
Karatsuba乘法超详细解析(原理+流程+性能分析+纯原生C#无第三方库完整实现)
算法·c#·大数乘法·高精度计算·数据结构与算法·分治算法·karatsuba 乘法
fpcc2 小时前
数据结构和算法—数学的应用
数据结构·c++·算法