• 大小: 6KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: C/C++
  • 标签: 重言式  

资源简介

实现重言式判别,编程语言为c++语言 数据结构上机实验

资源截图

代码片段和文件信息

#include 
#include 
#include 

typedef struct DutyElement
{
    char data;
    int duty;
}DutyElement;

DutyElement DutyArray[100];          //定义加权数组

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild *rchild;
}BiTNode *BiTree;

 void InitDutyArray(char *s int n)         //根据输入的序列初始化加权数组
 {
    int i j;
    for (i = 0; i < n; i++)
    {
        DutyArray[i].data = s[i];
        switch (DutyArray[i].data)          //分别赋权值
         {
        case ‘~‘:
            DutyArray[i].duty = 3; break;
        case ‘&‘:
            DutyArray[i].duty = 2; break;
        case ‘|‘:
            DutyArray[i].duty = 1; break;
        default:
            DutyArray[i].duty = 0; break;
        }
    }
    for (i = 0; i < n; i++)
    {
        if (DutyArray[i].data == ‘(‘)        //是左括号的话则对运算符进行加权操作
         {
            for (j = i; j < n; j++)
            {
                if (DutyArray[j].duty != 0)
                    DutyArray[j].duty += 5;
            }
        }
        else
        {
            if (DutyArray[i].data == ‘)‘)          //右括号的话对运算符进行减权操作
             {
                for (j = i; j < n; j++)
                {
                    if (DutyArray[j].duty != 0)
                        DutyArray[j].duty -= 5;
                }
            }
        }
    }
}

 int SearchMinDutyOperator(int a int b)          //寻找权值最小的运算符,即为二叉树的根节点
 {
    int i n = a duty = 1000;
    for (i = a; i < b + 1; i++)
    {
        if (DutyArray[i].duty > 0 && DutyArray[i].duty < duty)
        {
            n = i;
            duty = DutyArray[i].duty;
        }
    }
    return n;
}

 int ParenthesesCloesed(int a int b)        //判断序列是否在最外层有一对括号
 {
    int i n = 0;
    for (i = a; i <= b; i++)
    {
        if (DutyArray[i].data == ‘(‘)
            n++;
        if (DutyArray[i].data == ‘)‘)
            n--;
        if (n == 0)
            break;
    }
    if (i == b)
        return 1;
    else
        return 0;
}

BiTree Create(int a int b)                //根据加权数组创建二叉树
 {
    BiTree p;
    if (DutyArray[a].data == ‘(‘ && DutyArray[b].data == ‘)‘ && ParenthesesCloesed(a b) == 1)  //去括号
    {
        a += 1;
        b -= 1;
    }
    if (a > b)
        p = NULL;
    else
    {
        if (a == b)
        {
            p = (BiTNode *)malloc(sizeof(BiTNode));
            p->data = DutyArray[a].data;
            p->lchild = NULL;
            p->rchild = NULL;
        }
        else
        {
            int n;
            n = SearchMinDutyOperator(a b);
            p = (BiTNode *)malloc(sizeof(BiTNode));
            p->data = DutyArray[n].data;
            p->lchild = Create(a n - 1);
            p->rchild = Create(n + 1 b);
        }
    }
    return p;
}

void AssignValue(BiTree T char letter char binary)      //递归为对应的字母赋二进制字符
{
    if (T)
    {
        if (T->data == letter)
            T->da

评论

共有 条评论