m0_62746615 2022-11-02 19:40 采纳率: 85%
浏览 42
已结题

C语言表达式求值问题

怎样才能输入多组数

输入
5+(102)-6
8
(999+1)
1+5/(1-1)
7*2^3
输出
19
8000
NVALID
56


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define maximum 100000

typedef struct
{
    float data[maximum];
    int top;
}number;

typedef struct
{
    char data[maximum];
    int top;
}sign;

void InitNumber(number* stack);
void GetTopNumber(number stack, float* e);
void PushNumber(number* stack, float e);
void PopNumber(number* stack, float* e);

void InitSign(sign* stack);
void GetTopSign(sign stack, char* e);
void PushSign(sign* stack, char e);
void PopSign(sign* stack, char* e);

void Calculate(number* stack, char e);

number Num;
sign sig;
char expression[maximum];

int main()
{
    gets(expression);
    int length;
    length = strlen(expression);
    int i;
    float en, n;
    char es;
    InitNumber(&Num);
    InitSign(&sig);
    for (i = 0; i < length; i++)
    {
        if (expression[i] >= '0' && expression[i] <= '9')
        {
            n = expression[i] - '0';
            while (expression[i + 1] != '\0')
            {
                if (expression[i + 1] >= '0' && expression[i + 1] <= '9')
                {
                    n = n * 10 + expression[i + 1] - '0';
                    ++i;
                }
                else break;
            }
            PushNumber(&Num, n);
        }
        else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/' || expression[i] == '^' || expression[i] == '(' || expression[i] == ')')
        {
            switch (expression[i])
            {
            case '+':
                if (sig.data[sig.top - 1] != '+' && sig.data[sig.top - 1] != '-' && sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '+');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '+');
                }
                break;
            case '-':
                if (sig.data[sig.top - 1] != '+' && sig.data[sig.top - 1] != '-' && sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '-');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '-');
                }
                break;
            case '*':
                if (sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '*');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '*');
                }
                break;
            case '/':
                if (sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '/');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '/');
                }
                break;
            case '^':
                if (sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '^');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '^');
                }
            case '(':
                PushSign(&sig, '(');
                break;
            case ')':
                while (sig.data[sig.top - 1] != '(')
                {
                    PopSign(&sig, &es);
                    Calculate(&Num, es);
                }
                PopSign(&sig, &es);
            }
        }
    }
    while (sig.top > 0)
    {
        PopSign(&sig, &es);
        Calculate(&Num, es);
    }
    GetTopNumber(Num, &en);
    printf("%.0f\n", en);
    return 0;
}

void InitNumber(number* stack)
{
    stack->top = 0;
}

void GetTopNumber(number stack, float* e)
{
    if (stack.top == 0) return;
    else *e = stack.data[stack.top - 1];
}

void PushNumber(number* stack, float e)
{
    if (stack->top >= maximum) return;
    else stack->data[stack->top++] = e;
}

void PopNumber(number* stack, float* e)
{
    if (stack->top == 0) return;
    else *e = stack->data[--stack->top];
}

void InitSign(sign* stack)
{
    stack->top = 0;
}

void GetTopSign(sign stack, char* e)
{
    if (stack.top == 0) return;
    else *e = stack.data[stack.top - 1];
}

void PushSign(sign* stack, char e)
{
    if (stack->top >= maximum) return;
    else
    {
        stack->data[stack->top] = e;
        stack->top++;
    }
}

void PopSign(sign* stack, char* e)
{
    if (stack->top == 0) return;
    else *e = stack->data[--stack->top];
}

void Calculate(number* stack, char e)
{
    float num1, num2, result;
    PopNumber(stack, &num2);
    PopNumber(stack, &num1);
    switch (e)
    {
    case '+':
        result = num1 + num2;
        PushNumber(stack, result);
        break;
    case '-':
        result = num1 - num2;
        PushNumber(stack, result);
        break;
    case '*':
        result = num1 * num2;
        PushNumber(stack, result);
        break;
    case '/':
        if (num2 == 0) printf("表达式错误!");
        else
        {
            result = num1 / num2;
            PushNumber(stack, result);
            break;
        }
    case '^':
        result = pow(num1, num2);
        PushNumber(stack, result);
        break;
    }
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-11-02 22:29
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月8日
  • 已采纳回答 11月2日
  • 创建了问题 11月2日

悬赏问题

  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题