Apilar application_calculation de fórmulas de cálculo distribuidas por prioridad del operador (código, análisis, ensamblaje)

Tabla de contenido:

Código:

LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
tabla pila lineal

C Principal

#include <stdio.h>
#include "LinkStack.h"

//该程序用栈来计算算式 
/*
 比如:1*5+6/(5-3)  可以转换成 15*653-/+ 字符串进行运算
 注意:每个数只能是一位数
 */
 


int isNumber(char c)//检测是否是数字
{
    
    
    return ('0' <= c) && (c <= '9');
}

int isOperator(char c)//检测是否是加减乘除符号
{
    
    
    return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}

int value(char c)//字符返回数值
{
    
    
    return (c - '0');
}

int express(int left, int right, char op)//计算两个值加减乘除
{
    
    
    int ret = 0;
    
    switch(op)
    {
    
    
        case '+':
            ret = left + right;
            break;
        case '-':
            ret = left - right;
            break;
        case '*':
            ret = left * right;
            break;
        case '/':
            ret = left / right;
            break;
        default:
            break;
    }
    
    return ret;
}

int compute(const char* exp)//将字符串的算式计算结果
{
    
    
    LinkStack* stack = LinkStack_Create();//创建栈
    int ret = 0;
    int i = 0;
    
    while( exp[i] != '\0' )//将每个字符取出
    {
    
    
        if( isNumber(exp[i]) )//如果是数字
        {
    
    
			
            LinkStack_Push(stack, (void*)value(exp[i]));//将数值转成地址进栈 9转成000009
        }
        else if( isOperator(exp[i]) )//如果是运算符号
        {
    
    
            int right = (int)LinkStack_Pop(stack);
            int left = (int)LinkStack_Pop(stack);
            int result = express(left, right, exp[i]);//取出两个数值运算
            
            LinkStack_Push(stack, (void*)result);//再将结果进栈
        }
        else
        {
    
    
            printf("Invalid expression!");
            break;
        }
        
        i++;
    }
    
    if( (LinkStack_Size(stack) == 1) && (exp[i] == '\0') )//如果栈内只有一个元素就是最后的运算后进栈的结果
    {
    
    
        ret = (int)LinkStack_Pop(stack);//出栈获取算式结果
    } 
    else 
    {
    
    
        printf("Invalid expression!");
    }
    
    LinkStack_Destroy(stack);//销毁栈
    
    return ret;
}

int main()
{
    
    
    printf("9 + (3 - 1) * 5 + 8 / 2 = %d\n", compute("931-5*+82/+"));
    
	
	getchar();
    return 0;
}

análisis:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Compilacion:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_37599645/article/details/111944287
Recomendado
Clasificación