• 数据结构与算法 - 计算表达式


    第1关:栈的应用 - 计算中缀表达式

    任务描述

    本关任务要求通过实现函数double ComputeInfix(char* s)来计算中缀表达式。

    测试说明

    本关的测试过程如下:

    平台编译 step1/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件;
    平台运行该可执行文件,并以标准输入方式提供测试输入;
    平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
    输入输出说明:
    输入格式:
    输入一个中缀表达式。表达式中的操作数都是一个非负的个位数。
    输出格式:
    输出该表达式的值。

    以下是平台对 step1/Main.cpp 的测试样例:

    样例输入:
    (1+2)*(9-6)
    样例输出:
    result = 9.000000

    代码如下

    /**********************************************************
    	date: July 2017
        copyright: Zhu En(祝恩)
        DO NOT distribute this code.
    **********************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include "LnkStack.h"
    #include "Infix.h"
    
    //
    void compute(LinkStack* so, LinkStack* sd)
    //++++++++++++++++++++++++++++++++++++++++++++++
    //so 运算符栈
    //sd 操作数栈
    //1 从运算符栈出栈一个运算符
    //2 从操作数栈出栈两个操作数
    //3 用出栈的运算符对出栈的操作数进行运算
    //4 将运算结果进操作数栈
    //+++++++++++++++++++++++++++++++++++++++++++++++
    {
    	T a,b,c,d;
    	LS_Pop(so,c);
    	LS_Pop(sd,a);
    	LS_Pop(sd,b);
    	if (c=='*') d=b*a;
    	else if (c=='/') d=b/a;
    	else if (c=='+') d=b+a;
    	else if (c=='-') d=b-a;
    	else printf("never occur!");
    	LS_Push(sd, d);
    }
    
    double ComputeInfix(char* s)
    //计算中缀表达式
    {
        // 请在此添加代码,补全函数ComputeInfix,计算中缀表达式
        /********** Begin *********/
    int i=0;
        LinkStack* so=LS_Create(); //运算符栈
        LinkStack* sd=LS_Create(); //操作数栈
        while(s[i]) 
    	{
            if ('0'<=s[i] && s[i]<='9') 
    		{
    			LS_Push(sd, s[i++]-48);
                continue;
            }
            if(s[i]=='('||LS_IsEmpty(so)) 
    		{
                LS_Push(so, s[i++]); 
                continue;
            }
            if(s[i]==')') 
    		{
                T topitem;
                while(LS_Top(so,topitem) && topitem !='(' ) 
                {
                 compute(so, sd);
    			} 
                LS_Pop(so,topitem);
                i++;
                continue;
    			}
            if(s[i]=='*'||s[i]=='/') 
    		{
                T c;
                LS_Top(so,c);
                if (c=='*' || c=='/')
    			{
    				compute(so, sd);
    				} 
                LS_Push(so, s[i++]);
                continue;
    			}
            if(s[i]=='+'||s[i]=='-') 
    		{
                T topitem;
                while(LS_Top(so,topitem) && topitem !='(' ) 
    			{
                 	compute(so, sd);
    			}
                	LS_Push(so, s[i++]);
                	continue;
    				}
    				}
        while(!LS_IsEmpty(so)) 
        {
         compute(so, sd);
     } 
        T res;
        LS_Top(sd,res);
        LS_Free(so);
        LS_Free(sd);
        return res;
        /********** End **********/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97

    第2关:栈的应用 - 计算后缀表达式

    任务描述

    本关任务要求通过实现函数double ComputePostfix(char* s)来计算后缀表达式。

    测试说明

    本关的测试过程如下:

    平台编译 step2/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件;
    平台运行该可执行文件,并以标准输入方式提供测试输入;
    平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
    输入输出说明:
    输入格式:
    输入一个后缀表达式。表达式中的操作数都是一个非负的个位数。
    输出格式:
    输出该表达式的值。

    以下是平台对 step2/Main.cpp 的测试样例:

    样例输入:
    12+96-*
    样例输出:
    result = 9.000000

    代码如下

    /**********************************************************
    	date: July 2017
        copyright: Zhu En
        DO NOT distribute this code.
    **********************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include "LnkStack.h"
    #include "Postfix.h"
    
    double ComputePostfix(char* s)
    {
        // ÇëÔÚ´ËÌí¼Ó´úÂ룬²¹È«º¯ÊýComputePostfix£¬¼ÆËãºó׺±í´ïʽ
        /********** Begin *********/
        int i = 0;//数组下标
    	T num1 = 0;
    	T num2 = 0;
    	T num = 0;
    	LinkStack* so = LS_Create(); // 创建运算符栈
    	while (s[i])
    	{
    		if (s[i] >= '0'&&s[i] <= '9')//当检测的数组该位数是一个0-9的数就压入操作数栈
    		{
    			LS_Push(so, s[i++] - 48);//因为是字符类型 所以需要ASCII码-48
    			continue;//不执行本次循环后的操作 直接判断循环条件进而进入下一循环
    		}
    		if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
    		{
    			LS_Pop(so, num2);
    			LS_Pop(so, num1);
    			switch (s[i])
    			{
    
    			case '+':num = num1 + num2; LS_Push(so, num); break;
    			case '-':num = num1 - num2; LS_Push(so, num); break;
    			case '*':num = num1 * num2; LS_Push(so, num); break;
    			case '/':num = num1 / num2; LS_Push(so, num); break;
    			}
    			i++;
    		}
    	}
    	LS_Pop(so, num);
    	return num;
        /********** End **********/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    Python 全栈系列253 再梳理flask-celery的搭建
    小目标检测:基于切图检测的yolov5小目标训练
    Spring boot项目集成security
    Python爬虫学习——No.01
    Docker学习笔记(二)
    Sentinel1.8.6集成nacos
    python设置全局代理
    NodeMCU ESP8266 的PWM波形输出教程(图文并茂)
    验证周期--一个结构化的流程
    【字符】压缩文本文件
  • 原文地址:https://blog.csdn.net/qq_45917176/article/details/125542877