一、哈夫曼树的实现
定义哈夫曼树的结点
typedef struct HuffmanNode {
int weight; // 权重值
int parent, lchild, rchild; // 父结点和左右孩子结点下标
} HuffmanNode;
定义哈夫曼编码结构
typedef struct HuffmanCode {
char ch; // 字符
char code[MAX_NODE_NUM]; // 哈夫曼编码
} HuffmanCode;
选择两个权值最小的结点
void SelectMin(HuffmanNode *huffmanTree, int n, int *s1, int *s2) {
// 找出未被选择过且权值最小的两个结点
int i;
for (i = 0; i < n; i++) {
if (huffmanTree[i].parent == -1) {
*s1 = i;
break;
}
}
for (i = 0; i < n; i++) {
if (huffmanTree[i].parent == -1 && i != *s1) {
*s2 = i;
break;
}
}
// 选择未被选择过的结点中权值最小的两个结点
for (i = 0; i < n; i++) {
if (huffmanTree[i].parent == -1 && i != *s1 && huffmanTree[i].weight < huffmanTree[*s1].weight) {
*s2 = *s1;
*s1 = i;
}
else if (huffmanTree[i].parent == -1 && i != *s1 && i != *s2 && huffmanTree[i].weight < huffmanTree[*s2].weight) {
*s2 = i;
}
}
}
构造哈夫曼树
void CreateHuffmanTree(HuffmanNode *huffmanTree, int n) {
int i, s1, s2;
// 初始化哈夫曼树结点
for (i = 0; i < 2 * n - 1; i++) {
huffmanTree[i].parent = huffmanTree[i].lchild = huffmanTree[i].rchild = -1;
}
// 输入n个权值作为叶子结点
printf("请输入%d个权值:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &huffmanTree[i].weight);
}
// 构造哈夫曼树
for (i = 0; i < n - 1; i++) {
// 选择两个权值最小的结点s1和s2
SelectMin(huffmanTree, n + i, &s1, &s2);
// 新结点作为s1和s2的父结点
huffmanTree[s1].parent = huffmanTree[s2].parent = n + i;
huffmanTree[n + i].lchild = s1;
huffmanTree[n + i].rchild = s2;
huffmanTree[n + i].weight = huffmanTree[s1]
}
二、表达式括号匹配
思路
这个题可以用数组来实现栈,用链表的话还过于麻烦了,就是将字符串中的 ' ( ' 依次入栈,当遇见 ' ) ' 时,就将其出栈
代码实现
#include<stdio.h>
#include<string.h>
char b[300]; //栈
int top; //栈指针
int main()
{
int i;
char a[300];
scanf("%s", a,sizeof(a));
for (i = 0; i < strlen(a); i++)
{
if (a[i] == '(') b[++top] = '(';
if (a[i] == ')')
{
if (top == 0)
{
printf("NO");
return 0;
}
else top--;
}
}
if (top == 0) printf("YES");
else printf("NO");
return 0;
}