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

括号的匹配:

if((s[i]==')' && now=='(') || (s[i]==']' && 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;
}
相关推荐
代码骑士3 分钟前
聚类(Clustering)基础知识3
算法·支持向量机·聚类
梦姐的编程日志11 分钟前
从研究动机视角对无监督图像去雾论文的分类
图像处理·人工智能·深度学习·算法·计算机视觉
Y1nhl14 分钟前
搜广推校招面经六十二
人工智能·pytorch·python·算法·机器学习·推荐算法·搜索算法
蓝白咖啡29 分钟前
华为OD机试 - 王者荣耀匹配机制 - 回溯(Java 2024 D卷 200分)
java·python·算法·华为od·机试
傍晚冰川32 分钟前
【STM32】WDG看门狗(学习笔记)
c语言·笔记·科技·stm32·单片机·嵌入式硬件·学习
Moonnnn.1 小时前
运算放大器(三)运算放大器的典型应用
笔记·学习·硬件工程
郭源潮11 小时前
《八大排序算法》
数据结构·算法·排序算法·c
技术小齐1 小时前
网络运维学习笔记(DeepSeek优化版)026 OSPF vlink(Virtual Link,虚链路)配置详解
运维·网络·学习
Suc_zhan1 小时前
实验一 基于支持向量机实现激酶抑制剂的分类
python·算法·支持向量机·分类
电科_银尘1 小时前
【Matlab】-- 基于MATLAB的灰狼算法优化支持向量机的分类算法
算法·支持向量机·matlab