【数据结构与算法】魔王语言解释(C/C++)

这篇具有很好参考价值的文章主要介绍了【数据结构与算法】魔王语言解释(C/C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实践要求

1. 问题描述

有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
形式一
α → β 1 β 2 . . . β m \alpha \to \beta _{1} \beta_{2}...\beta_{m} αβ1β2...βm
形式二
( θ δ 1 δ 2 . . . δ n ) → θ δ n θ δ n − 1 . . . . θ δ 1 θ (\theta \delta _{1}\delta_{2}...\delta _{n}) \to \theta\delta _{n}\theta\delta _{n-1}....\theta \delta _{1}\theta (θδ1δ2...δn)θδnθδn1....θδ1θ


2. 基本要求

用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言解释的词汇,小写字母表示人的语言的词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。
规则一
B → t A d A B \to tAdA BtAdA
规则二
A → s a e A \to sae Asae


3. 测试数据

3.1 input

B(einxgz)B

3.2 output

tsaedsaeezegexeneietsaedsae


4. 实现提示

将魔王的语言自右至左进栈,总是处理栈顶。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者思考应如何处理。应首先实现栈和队列的基本运算。


实践报告

1. 题目分析

说明程序设计的任务,强调的是程序要做什么,此外列出各成员分工

程序设计任务:
设计一个解释魔王语言的程序将含有大写字母、小写字母、圆括号的字符串全部转化为人类语言(全部都为小写字母)。


2. 数据结构设计

说明程序用到的数据结构的定义,主程序的流程及各模块之间的层次关系

栈(用链表实现的,栈顶指针指向最上面的一个元素)

主程序流程图

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言

各模块的层级关系

注:在此只列出有调用其他函数的函数

Main函数

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言

InputAndCheck函数

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言


3. 程序设计

实现概要设计中的数据类型,对主程序、模块及主要操作写出伪代码,画出函数的调用关系

数据类型

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言

主程序操作伪代码

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言

模块伪代码

操作伪代码
InputAndCheck

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言

操作伪代码
字符串逆置

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言

将一句话倒着插入栈中

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言

将一句话正着插入栈中

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言


4. 调试分析

遇到的问题

  1. 在调用inputAndCheck函数时若输入大写字母的解释仍有大写字母将进行递归,递归传入的参数中有栈,需要注意的是不能传入一开始的栈,而是需要新开一个栈并传入也就是代码中的Stack newSta。如下:用户输入B(exingz)B -> 用户需要输入B的解释 -> 输入tAdA -> 需要用户输入A的解释 -> 输入sae。如果递归时候不传入一个新的栈,那么对A的解释将会变成tsae。
  2. 在调用inputAndCheck函数的最后会将对该大写字母的解释存入test数组中,若不在最后加上 \0 则输出最终字符串时会产生输入多余的乱码的情况如(会输出tsaed潪saeezegexeneiets笅aedsae)虽然字符没错,但是会输出多余的乱码。

程序复杂度分析

T ( n ) = O ( n ) T(n) = O(n) T(n)=O(n)


5. 测试结果

列出测试结果,包括输入和输出

测试结果

input 1st

B(einxgz)B

output 1st

请输入B字符的解释

input 2st

tAdA

output 2st

请输入A字符的解释

input 3st

sae

output 3st

tsaedsaeezegexeneietsaedsae

魔王语言解释,算法与数据结构,C/C++,c语言,c++,开发语言


6. 用户使用说明

给出主界面及主要功能界面

7. 附录

源程序文件清单:
Mowangyuyan.cpp //主程序

8. 全部代码

mowangyuyan.cpp

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#define MAX_SIZE 100

// 定义一个结构体,用来表示栈中的节点
struct node
{
    char val;
    node *next;
};

// 定义一个栈类
class Stack
{
private:
    // 栈顶指针
    node *top_ptr = nullptr;

public:
    // 判断栈是否为空
    bool isEmpty()
    {
        return top_ptr == nullptr ? true : false;
    }
    // 获取栈顶元素
    char top()
    {
        return top_ptr->val;
    }
    // 入栈操作
    void push(char c)
    {
        node *new_node = new node{c, top_ptr};
        top_ptr = new_node;
    }
    // 弹出栈顶元素
    bool pop()
    {
        if (isEmpty())
            return false;
        node *to_be_deleted = top_ptr;
        top_ptr = top_ptr->next;
        delete to_be_deleted;
        return true;
    }
    // 置空栈
    void clear()
    {
        while (top_ptr)
        {
            node *tmp = top_ptr;
            top_ptr = top_ptr->next;
            delete tmp;
        }
    }
    // 析构函数
    ~Stack()
    {
        clear();
    }
};
// 将字符串逆置
void reverseStr(char str[], int length)
{
    int start = 0;
    int end = length - 1;
    while (start < end)
    {
        swap(str[start], str[end]);
        start++;
        end--;
    }
}
// 将一条语句倒着放入栈中
void invert(Stack &sta, char setence[])
{
    // 一句话的长度
    int len = strlen(setence) / sizeof(char);
    for (int i = len - 1; i >= 0; --i)
    {
        sta.push(setence[i]);
    }
}
// 将一句话正着放入栈中
void reverseInvert(Stack &sta, char setence[])
{
    // 一句话的长度
    int len = strlen(setence) / sizeof(char);
    for (int i = 0; i <= len - 1; ++i)
    {
        sta.push(setence[i]);
    }
}

// 检查输入的字符是否全为小写字符 ch为输入的字符,index为其字符的ASCII码 - A的ASCII的值, text为预处理后的各大写字母的表示
void inputAndCheck(Stack &sta, char ch, int index, char test[26][MAX_SIZE])
{
    char supperVoca[MAX_SIZE]; // 存放用户输入该大写字母的表示
    int vocaVal;               // 输入解释字符的ASCII码
    char final[MAX_SIZE];      // 最终的解释
    printf("请输入%c字符的解释", ch);
    scanf("%s", supperVoca);
    for (int i = 0; i < strlen(supperVoca) / sizeof(char); i++) // 挨个检查输入的解释是否为小写字母
    {
        vocaVal = supperVoca[i];
        if (isupper(vocaVal) && test[vocaVal - 'A'][0] == '\0') // 如果输入的是大写字母且该大写字母并无解释
        {
            if (vocaVal - 'A' != index) // 检查是否为已经处理过的字母,避免死循环
            {
                Stack newSta;                                              // 创建一个空栈(易漏)
                inputAndCheck(newSta, supperVoca[i], vocaVal - 'A', test); // 递归
            }
        }
        if (isupper(vocaVal) && test[vocaVal - 'A'][0] != '\0') // 如果输入的是大写字母且该大写字母有相应的解释
        {
            reverseInvert(sta, test[vocaVal - 'A']); // 将该大写字母的解释正着插入栈中
        }
        else
            sta.push(supperVoca[i]); // 如果是小写字母则直接插入栈中
    }
    int i = 0; // 共有多少个字符
    while (!sta.isEmpty())
    {
        char tmp = sta.top();
        sta.pop();
        final[i] = tmp;
        i++;
    }
    reverseStr(final, i);
    int j = 0;
    while (j < i)
    {
        test[index][j] = final[j];
        j++;
    }
    test[index][j] = '\0'; // 在每个大写字母的最终解释后加个\0
}
int main()
{
    // test
    char test[26][MAX_SIZE];        // 存放26个大写英文字母的所对应的小写字母解释
    char language[MAX_SIZE];        // 一开始的魔王语言
    char inBrackets[MAX_SIZE];      // 括号内的字符
    char translatedInBra[MAX_SIZE]; // 转化括号内的字符
    char translation[MAX_SIZE];     // 最终解释的字符
    bool flag = false;              // 是否在括号内的标志
    Stack translatedLanguage;       // 经过大小写转换后的栈
    Stack finalInterp;              // 每个大写字母最终解释的栈
    for (int i = 0; i < 26; ++i)    // 初始化
    {
        test[i][0] = '\0';
    }
    scanf("%s", language);                            // 输入魔王语言
    int langLength = strlen(language) / sizeof(char); // 求出输入字符的长度
    for (int i = 0; i < langLength; i++)
    {
        int Char = language[i]; // 字符的ASCII码值
        if (isupper(Char))
        {
            if (test[Char - 'A'][0] == '\0')
            {
                // 输入并检查是否含有大写字幕
                inputAndCheck(finalInterp, language[i], Char - 'A', test);
            }
        }
    }
    reverseInvert(translatedLanguage, language);
    int i = 0;
    int j = 0;
    while (!translatedLanguage.isEmpty())
    {
        char tmp = translatedLanguage.top();
        translatedLanguage.pop();
        if (isupper(tmp))
        {
            reverseInvert(translatedLanguage, test[tmp - 'A']);
        }
        else if (tmp == ')')
        {
            flag = true;
        }
        else if (tmp == '(')
        {
            flag = false;
            int inBracketsLength = strlen(inBrackets) / sizeof(char);
            int counter1 = 0;
            int counter2 = 0;
            while (counter1 != inBracketsLength)
            {
                translatedInBra[counter2] = inBrackets[inBracketsLength - 1];
                if (counter1 != (inBracketsLength - 1))
                {
                    translatedInBra[counter2 + 1] = inBrackets[counter1];
                }
                counter1 = counter1 + 1;
                counter2 = counter2 + 2;
            }
            reverseInvert(translatedLanguage, translatedInBra);
        }
        else
        {
            if (flag)
            {
                inBrackets[i] = tmp;
                i = i + 1;
            }
            if (!flag)
            {
                translation[j] = tmp;
                j++;
            }
        }
    }
    reverseStr(translation, j);
    for (int k = 0; k < j; k++)
    {
        printf("%c", translation[k]);
    }
    return 0;
}

结束语

  因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!文章来源地址https://www.toymoban.com/news/detail-734504.html

到了这里,关于【数据结构与算法】魔王语言解释(C/C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言 数据结构与算法 I

    因为之前写算法都是用C++,也有了些C++基础,变量常量数据类型就跳过去吧。 首先是环境,学C++时候用Clion,C语言也用它写吧~ 新建项目,选C执行文件,语言标准。。。就先默认C99吧,反正是测试环境,应该问题不大 直接运行一手 嗯。。JB家的新UI。。真是。。。。。。。一

    2024年02月09日
    浏览(31)
  • 数据结构与算法——排序(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月09日
    浏览(37)
  • C语言 数据结构--栈 括号匹配算法

    今天这一期使用栈来完成括号匹配算法 ① 栈结构 ② 初始化栈 ③ 入栈 ④ 出栈 ⑤ 判断栈是否为空 ⑤ 括号匹配 完整代码: 结果: (1)括号序列为char str[]={\\\'(\\\',\\\'{\\\',\\\'[\\\',\\\']\\\',\\\'}\\\',\\\')\\\'}; (2)括号序列为char str1[]={\\\'{\\\',\\\'(\\\',\\\'}\\\',\\\']\\\'};    

    2024年02月05日
    浏览(36)
  • 【C/C++数据结构与算法】C语言数据存储

    目录 一、大小端存储 二、整型提升和截断 三、数据的二进制存储 四、结构体内存对齐 大端存储 :数据的低位字节存储在高地址 小端存储 :数据的低位字节存储在低地址 不同编译器有不同的存储方式 提升 :短字节数据类型 --- 长字节数据类型 截断 :长字节数据类型 --

    2024年02月09日
    浏览(30)
  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(32)
  • (C语言)数据结构算法-病毒感染检测(BF算法&&KMP算法)

    病毒感染检测: 医学研究者最近发现了某些新病毒,得知它们的DNA序列都是环状的。为了快速检测出患者是否感染了相应的病毒,研究者将患者的DNA和病毒的DNA均表示成一些字母组成的字符串序列,然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人

    2024年02月08日
    浏览(36)
  • [数据结构-C语言] 算法的时间复杂度

    目录 1.算法的复杂度 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 3、常见时间复杂度计算举例 3.1 冒泡排序 3.2 二分查找 3.3 阶乘递归 3.4 斐波那契数列 1.算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此 衡量一个算法的

    2024年02月02日
    浏览(29)
  • 内部排序算法比较-数据结构C语言课设

    名称: 内部排序算法比较 内容: 在教科书中,各种内部排序算法的时间复杂的分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机数据比较各种算法的比较次数和移动次数,以取得直观感受。 任务: (1)对以下7中常会用的内部排序算法进行比较

    2024年02月12日
    浏览(43)
  • 『初阶数据结构 • C语言』② - 算法为何重要

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。   算法这个词听起来很深奥,其实不然。它只是解决某个问题的一套流程。  准备一碗麦片的流程也可以说是一种算法,它包含以下 4步(对我来说

    2024年02月14日
    浏览(21)
  • 数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)五

    数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵的角度讨论二维数组的存储,同时讲解广义表的存储结构以及有关其广度和

    2024年01月23日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包