数据结构---表达式求值

简介: 数据结构---表达式求值

表达式求值

题目描述

从键盘输入一个算术表达式并输出它的结果,算术表达式可包含加、减、乘、除、十进制整数和小括号,利用栈实现。

题目解析

本题难度较高,属于高阶题目,需要先转后缀表达式再计算,这里展示一种解法,后续学习了高阶解决方法会更新该题目,下面代码由本人进行一定程度改造所写,基本功能可以实现,如有其他bug自行解决

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define N 30

typedef struct my_stack
{
   
    int a[N];
    int top;
}ST;

int isempty(ST* T)
{
   
    if (T->top < 0)
        return 1;
    else
        return 0;
}

int isfull(ST* T)
{
   
    if (T->top == N - 1)
        return 1;
    else
        return 0;
}

int gettop(ST* T)
{
   
    return T->a[T->top];
}

int pop(ST* T)
{
   
    int x;
    if (T->top < 0)
    {
   
        printf("Zhan is empty,can not pop!\n");
        exit(0);
    }
    else
    {
   
        x = T->a[T->top];
        (T->top)--;
        return x;
    }
}

void push(ST* T, int s)
{
   
    if (T->top == N - 1)
    {
   
        printf("Zhan is full,can not push,you can modify N and then you can push again.\n");
        exit(0);
    }
    else
    {
   
        (T->top)++;
        T->a[T->top] = s;
    }
}

void transfer(char* in, char* post)
{
   
    ST T;
    int i, j, flag = 0;
    int count;
    int right = 0, left = 0;
    T.top = -1;
    for (i = 0, j = 0; in[i] != '\0'; i++)
    {
   
        switch (in[i])
        {
   
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            for (count = 0; (in[i] <= '9' && in[i] >= '0') || in[i] == '.'; i++, j++)
            {
   
                post[j] = in[i];
                if (in[i] == '.')
                    count++;
            }
            i--;
            if (count > 1)
            {
   
                printf("数中有两个小数点\n");
                exit(0);
            }
            post[j] = ' ';
            j++;
            flag = 1;
            break;
        case '(':
            if (flag)
            {
   
                printf("数字后直接跟括号\n");
                exit(0);
            }
            push(&T, in[i]);
            left++;
            break;
        case ')':
            right++;
            while (gettop(&T) != '(')
            {
   
                post[j] = pop(&T);
                j++;
            }
            pop(&T);
            break;
        case '+':

        case '-':
            if (!flag && i != 0)
            {
   
                printf("有连续两个运算符之间没有数字\n");
                exit(0);
            }
            while (!isempty(&T) && gettop(&T) != '(')
            {
   
                post[j] = pop(&T);
                j++;
            }
            push(&T, in[i]);
            flag = 0;
            break;
        case '*':

        case '/':
            if (!flag)
            {
   
                printf("有连续两个运算符之间没有数字\n");
                exit(0);
            }
            while (!isempty(&T) && (gettop(&T) == '/' || gettop(&T) == '*'))
            {
   
                post[j] = pop(&T);
                j++;
            }
            push(&T, in[i]);
            flag = 0;
            break;
        default:
            printf("输入非法字符,无法试别\n");
            exit(0);
        }
    }
    if (left != right)
    {
   
        printf("左右括号不匹配\n");
        exit(0);
    }
    while (!isempty(&T))
    {
   
        post[j] = pop(&T);
        j++;
    }
    post[j] = '\0';
}

float Calculate_zhong(char* post)
{
   
    int i, j, top = -1, flag;
    int len;
    float temp, aa[N]={
   0};
    char ch[N];
    for (i = 0; post[i] != '\0'; i++)
    {
   
        if (post[i] >= '0' && post[i] <= '9')
        {
   
            flag = 0;
            j = 0;
            while (post[i] != ' ')
            {
   
                if (post[i] == '.')
                {
   
                    flag = 1;
                }
                ch[j] = post[i];
                i++;
                j++;
            }
            ch[j] = '\0';
            if (flag)
            {
   
                for (j = 0; ch[j] != '.'; j++);
                len = j - 1;
                for (j = 0, temp = 0.; ch[j] != '.'; j++)
                {
   
                    temp += (ch[j] - '0') * (float)pow(10, len - j);
                }
                for (j++, len++; ch[j] != '\0'; j++)
                {
   
                    temp += (ch[j] - '0') * (float)pow(10, len - j);
                }
            }
            else
            {
   
                for (j = 0; ch[j] != '\0'; j++);
                len = j - 1;
                for (j = 0, temp = 0.; ch[j] != '\0'; j++)
                {
   
                    temp += (ch[j] - '0') * (float)pow(10, len - j);
                }
            }
            top++;
            aa[top] = temp;
        }
        else
        {
   
            switch (post[i])
            {
   
            case'+':
                temp = aa[top];
                top--;
                temp += aa[top];
                aa[top] = temp;
                break;
            case'-':
                temp = aa[top];
                top--;
                temp = aa[top] - temp;
                aa[top] = temp;
                break;
            case'*':
                temp = aa[top];
                top--;
                temp = temp * aa[top];
                aa[top] = temp;
                break;
            case'/':
                temp = aa[top];
                top--;
                temp = aa[top] / temp;
                aa[top] = temp;
            }
        }
    }
    return aa[top];
}


int main()
{
   
    char zhong[N], hou[N];
    float answer;
    printf("需要计算的中缀表达式为:");
    scanf("%s", zhong);
    transfer(zhong, hou);
    answer = Calculate_zhong(hou);
    printf("%.2f\n", answer);
}
相关文章
|
5天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1573 112
|
12天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1940 8
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
6天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
|
6天前
|
编解码 人工智能 安全
2核4G/4核8G/8核16G阿里云服务器如何选择实例?经济型e、通用算力型u2i与计算型c9i选哪个?
本文介绍了阿里云2核4G、4核8G、8核16G三档主流配置下经济型e、通用算力型u2i和计算型c9i三种实例的最新活动价格与适用场景。同配置下三者价差显著,以2核4G为例,经济型e低至599.93元/年,计算型c9i则高达1742.08元/年。文章详细解析了各实例的性能定位:经济型e适合轻负载入门场景,u2i兼顾稳定算力与性价比,c9i凭借第9代至强处理器与芯片级安全能力支撑高性能业务。同时提示用户可叠加满减优惠券享受折上折,建议根据业务负载与预算综合决策。
526 112
|
18天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
2565 4
|
10天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
721 111
|
20天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2634 13
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
6天前
|
人工智能 JSON Shell
2026AI漫剧本地全开源方案(附各个软件模型链接),8G显卡也能流畅运行
这是一套完全本地化部署的AI漫剧生成技术链路:涵盖LLM剧本分镜生成、FLUX文生图(IP-Adapter人脸锁定)、StoryDiffusion时序连贯控制、LTX-2.3唇形同步视频生成,及ComfyUI全流程调度。零云端费用,仅耗硬件算力,单集2–4小时可产出竖屏短视频,适配抖音/B站分发。
|
7天前
Qoder 一周年 × Qwen3.8-Max 正式上线,多重好礼限时领
8月3日,Qwen3.8-Max 正式上线Qoder,迎来Qoder一周年。新老用户可领800次免费调用,下单再赠2000次;夜间(22:00–08:00)调用5折;邀请好友双方得积分与调用额度。
448 1

热门文章

最新文章