IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言栈的应用——后缀表达式求值 -> 正文阅读

[C++知识库]C语言栈的应用——后缀表达式求值

算法思路

? 上次已经完成了由中缀表达式转后缀表达式的算法,而后缀表达式的优点就是可以从左至右直接读取,没有算数优先级的考量,所以直接进行运算即可。

? 该算法需要使用一个栈用来保存操作数,在读取到数字的时候,将数字压入栈中;如果读取到操作符,就弹出栈顶的两个元素,分别为op2和op1(先弹出来的元素为op2),将op1和op2与目前读取到的操作符进行计算,并将结果压回栈中。反复运行直到后缀表达式全部读取完成,此时栈中的结果即后缀表达式的结果。

具体过程

例后缀表达式12+3-45*2/+,定义一个栈num来保存数字,顺序读取后缀表达式。

  1. 读取到数字1,将其压入栈中,此时num = ['1']
  2. 读取到数字2,将其压入栈中,此时num = ['1','2']
  3. 读取到操作符+,将栈顶的两个元素弹出,op2=2op1=1,将op1+op2的结果压入栈中,此时num = ['3']
  4. 读取到数字3,将其压入栈中,此时num = ['3','3']
  5. 读取到操作符-,将栈顶的两个元素弹出,op2=3op1=3,将op1-op2的结果压入栈中,此时num = ['0']
  6. 读取到数字4,将其压入栈中,此时num = ['0','4']
  7. 读取到数字5,将其压入栈中,此时num = ['0','4','5']
  8. 读取到操作符*,将栈顶的两个元素弹出,op2=5op1=4,将op1*op2的结果压入栈中,此时num = ['0','20']
  9. 读取到数字2,将其压入栈中,此时num = ['0','20','2']
  10. 读取到操作符/,将栈顶的两个元素弹出,op2=2op1=20,将op1/op2的结果压入栈中,此时num = ['0','10']
  11. 读取到操作符+,将栈顶的两个元素弹出,op2=10op1=0,将op1+op2的结果压入栈中,此时num = ['10']
  12. 后缀表达式读取完毕,此时栈num的内容即后缀表达式的结果。

代码实现

// 后缀表达式求值
void postfixEval()
{
    char postfixList[100] = {0};    // 使用char类型数组保存后缀表达式
    printf("请输入将要求值的后缀表达式:\n");
    scanf("%s", postfixList);
    getchar();
    int length;
    length = (int) strlen(postfixList);
    LiStack num;    // 定义栈num保存数字,并定义
    num = initStack();

    for (int i = 0; i < length; i++)
    {
        if (isdigit(postfixList[i]))
        {
            int nums = asciiToint(postfixList[i]);  // 因为在char类型中保存数字是ascii码类型,所以需要将其转义,具体函数在下方
            push(num, nums);    // 将数字压入栈中
        }
        else
        {
            int second = pop(num);
            int first = pop(num);
            push(num, domatch(first, postfixList[i], second));  // 调用domatch(定义在下方),将对应结果再次压入栈中
        }
    }
    printf("该表达式的值为%d\n", pop(num));
}

// 将ascii码转化为整形

int asciiToint(char ascii)
{
    // 因为在ascii码中,48表示0,49表示1……将ascii-'0',就是将对应数字的ascii码减去48,结果就是十进制中的数字
    int i = ascii - '0';
    return i;
}

// 算数求值
int domatch(int op1, char op, int op2)  // 将char类型的运算符进行相应的运算
{
    int first = (int)op1, second = (int)op2;
    if (op == '*')
    {
        return first * second;
    }
    else if(op == '/')
    {
        return first / second;
    }
    else if (op == '+')
    {
        return first + second;
    }
    else
    {
        return first - second;
    }
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 11:59:07  更:2021-08-11 12:04:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 22:53:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码