8588 表达式求值

### 思路
1. **初始化栈**:创建两个栈,一个用于存储操作数,另一个用于存储操作符。
2. **遍历表达式**:逐个字符检查:
   - 如果是数字,读取完整数字并压入操作数栈。
   - 如果是操作符,根据优先级处理:
     - 如果当前操作符优先级高于栈顶操作符,压入操作符栈。
     - 否则,从操作符栈弹出操作符并从操作数栈弹出两个操作数进行计算,将结果压入操作数栈,重复此过程直到当前操作符优先级高于栈顶操作符。
   - 如果是左括号,直接压入操作符栈。
   - 如果是右括号,弹出操作符栈顶操作符并进行计算,直到遇到左括号。
3. **处理剩余操作符**:遍历结束后,处理操作符栈中剩余的操作符。
4. **输出结果**:操作数栈顶即为最终结果。

### 伪代码
```
function InitStack(S):
    allocate memory for S.base of size STACK_INIT_SIZE
    S.top = S.base
    S.stacksize = STACK_INIT_SIZE
    return OK

function Push(S, e):
    if S.top - S.base >= S.stacksize:
        reallocate memory for S.base with size S.stacksize + STACKINCREMENT
        S.top = S.base + S.stacksize
        S.stacksize += STACKINCREMENT
    S.top = e
    S.top += 1
    return OK

function Pop(S, e):
    if S.top == S.base:
        return ERROR
    S.top -= 1
    e = S.top
    return OK

function GetTop(S, e):
    if S.top == S.base:
        return ERROR
    e = S.top - 1
    return OK

function precedence(op):
    if op is '+' or '-':
        return 1
    if op is '*' or '/':
        return 2
    return 0

function applyOp(a, b, op):
    if op is '+':
        return a + b
    if op is '-':
        return a - b
    if op is '*':
        return a * b
    if op is '/':
        return a / b

function evaluate(expression):
    initialize stack values
    initialize stack ops
    for each character in expression:
        if character is digit:
            read full number and push to values
        else if character is '(':
            push to ops
        else if character is ')':
            while top of ops is not '(':
                pop from values and ops, apply operation, push result to values
            pop '(' from ops
        else if character is operator:
            while ops is not empty and precedence of top of ops >= precedence of character:
                pop from values and ops, apply operation, push result to values
            push character to ops
    while ops is not empty:
        pop from values and ops, apply operation, push result to values
    return top of values
```

### C++代码
 

#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cstring>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量typedef int SElemType; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
using namespace std;struct SqStack {SElemType *base; // 在栈构造之前和销毁之后,base的值为NULLSElemType *top; // 栈顶指针int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈Status InitStack(SqStack &S) {S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (!S.base) return ERROR;S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}Status Push(SqStack &S, SElemType e) {if (S.top - S.base >= S.stacksize) {S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));if (!S.base) return ERROR;S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;
}Status Pop(SqStack &S, SElemType &e) {if (S.top == S.base) return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, SElemType &e) {if (S.top == S.base) return ERROR;e = *(S.top - 1);return OK;
}char prio(char e, char c) { // 比较运算符优先级char n;switch (c) {case '+':case '-':n = (e == '(' || e == '=') ? '<' : '>';break;case '*':case '/':n = (e == '*' || e == '/' || e == ')') ? '>' : '<';break;case '(':if (e == ')') {printf("括号不匹配\n");exit(ERROR);}n = '<';break;case ')':if (e == '(') n = '=';else if (e == '=') {printf("缺少左括号\n");exit(ERROR);} else n = '>';break;case '=':if (e == '=') n = '=';else if (e == '(') {printf("缺少右括号\n");exit(ERROR);} else n = '>';break;}return n;
}int main() {SqStack s1, s2; // s1操作数栈,s2算符栈InitStack(s1);InitStack(s2);Push(s2, '=');char w;w = getchar();int e;GetTop(s2, e);while (w != '=' || e != '=') {int d = 0;if (w >= '0' && w <= '9') {while (w >= '0' && w <= '9') {d = d * 10 + (w - '0');w = getchar();}Push(s1, d);} else {if (prio(e, w) == '<') {Push(s2, w);w = getchar();} else if (prio(e, w) == '=' && w == ')') {int t;Pop(s2, t);w = getchar();} else if (prio(e, w) == '>') {int a, b, c = 0, d;Pop(s1, a);Pop(s1, b);Pop(s2, d);if (d == '+') c = a + b;else if (d == '-') c = b - a;else if (d == '/') c = b / a;else if (d == '*') c = b * a;Push(s1, c);}}GetTop(s2, e);}int r;Pop(s1, r);cout << r << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146699.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

asp.net门诊管理系统网站(含协同过滤算法)VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net门诊管理系统网站是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发。 应用技术&#xff1a;asp.net c…

x-cmd pkg | bat: cat 命令现代化替代品,终端用户必备工具

目录 简介快速上手安装使用与第三方工具组合使用 功能特点竞品和相关作品进一步阅读 简介 bat 是由 github.com/sharkdp 用 Rust 开发的 cat 命令现代化替代品。它比 cat 命令扩展了更多的现代化功能&#xff0c;如语法高亮、自动分页、Git集成等&#xff0c;能为用户提供更为…

[001-02-001].第2节:java开发环境搭建

4.1.书籍推荐&#xff1a; 4.2.人机交互方式 1.图形化界面(Graphical User Interface GUI)这种方式简单直观&#xff0c;使用者易于接受&#xff0c;容易上手操作2.命令行方式(Command Line Interface CLI)&#xff1a;需要有一个控制台&#xff0c;输入特定的指令&#xff0c…

0基础跟德姆(dom)一起学AI 数据处理和统计分析06-数据组合和缺失值处理

* 数据组合 * concat * merge * join(了解) * 缺失值处理 * apply方法详解 --- 1.DataFrame数据组合-concat连接 * 概述 * 连接是指把某行或某列追加到数据中, 数据被分成了多份可以使用连接把数据拼接起来 * 把计算的结果追加到现有数据集&#xff0c;也可以使用连…

Netty源码-业务流程之构建连接

Netty基本介绍&#xff0c;参考 Netty与网络编程 1、Netty构建连接 构建连接的流程 1.1 我们知道客户端连接服务端都是通过NioEventLoop来处理请求&#xff0c;NioEventLoop是一个线程&#xff0c;连接进来首先进入run()方法。 所以我们需要启动服务端&#xff0c;然后再启动…

基于JAVA+SpringBoot+Vue的线上辅导班系统的开发与设计

基于JAVASpringBootVue的线上辅导班系统的开发与设计 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#…

《当人工智能考上名校》:拥抱变化,让自己无可替代

01 说起人工智能&#xff0c;你会想起什么呢&#xff1f; 2016年3月&#xff0c;谷歌&#xff08;Google&#xff09;旗下DeepMind公司人工智能机器人阿尔法狗&#xff08;AlphaGo&#xff09;与围棋世界冠军、职业九段棋手李世石进行围棋人机大战&#xff0c;以4比1的总比分获…

【Canvas与诗词】木兰辞节选

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金边钢底徽章</title><style type"text/css">…

通信入门系列书籍推荐一:通信原理和通信原理学习辅导

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、背景 二、通信原理 …

探秘 Web Bluetooth API:连接蓝牙设备的新利器

引言 随着物联网技术的快速发展&#xff0c;蓝牙设备在日常生活中扮演着越来越重要的角色。而在 Web 开发领域&#xff0c;Web Bluetooth API 的出现为我们提供了一种全新的方式来连接和控制蓝牙设备。本文将深入探讨 Web Bluetooth API 的使用方法和原理&#xff0c;帮助开发…

react:React Hook函数

使用规则 只能在组件中或者其他自定义的Hook函数中调用 只能在组件的顶层调用&#xff0c;不能嵌套在if、for、 其他函数中 基础Hook 函数 useState useState是一个hook函数&#xff0c;它允许我们向组件中添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 示例1…

全面详尽的 PHP 环境搭建教程

目录 目录 PHP 环境搭建概述 在 Windows 上搭建 PHP 环境 使用集成环境 XAMPP 安装步骤 配置和测试 常用配置 手动安装 Apache、PHP 和 MySQL 安装 Apache 安装 PHP 安装 MySQL 配置 PHP 连接 MySQL 在 Linux 上搭建 PHP 环境 使用 LAMP 方案 安装 Apache 安装 …

【管理文档】项目管理计划书(word原件套用2024)

本文档为XXX系统项目管理计划&#xff0c;本计划的主要目的是通过本方案明确本项目的项目管理体系。方案的主要内容包括&#xff1a;明确项目的目标及工作范围&#xff0c;明确项目的组织结构和人员分工&#xff0c;确立项目的沟通环境&#xff0c;确立项目进度管理方法&#x…

麻豆源码/视频源码/苹果cms-v10版本/带采集规则/完美运营版

麻豆源码/视频源码/苹果cms-v10版本/带采集规则/完美运营版 一键部署版本 完美运营版本带采集规则模块 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89776673 更多资源下载&#xff1a;关注我。

系列课程:从零开始接触人工智能大模型

人工智能是计算机科学领域中最具前瞻性和影响力的技术之一。它是一种智慧型算法&#xff0c;能够模拟人类的思维过程&#xff0c;处理大量的数据和信息&#xff0c;从而发现隐藏在其中的规律和趋势。人工智能的应用范围非常广泛&#xff0c;包括语音识别、图像识别、自然语言处…

【解答】简述堆栈指针寄存器SP的功能及堆栈操作的过程。

堆栈指针寄存器 SP 的功能 指示栈顶在内存中的位置。 堆栈操作过程 入栈时&#xff0c;先将 SP 减 数据字节数&#xff08;例如&#xff0c;16位数据要加上2&#xff09;&#xff0c;然后把数据压入 SP 指向的内存单元&#xff1b;出栈时&#xff0c;先从 SP 指向的内存单元…

构建高可用和高防御力的云服务架构第二部分:SLB负载均衡(2/5)

在现代云服务中&#xff0c;负载均衡&#xff08;Load Balancing&#xff09;是一种关键技术&#xff0c;用于优化资源利用、最小化响应时间、提高系统的可伸缩性和可靠性。负载均衡器位于客户端和服务器之间&#xff0c;根据预设的策略将请求分发到多个服务器上&#xff0c;以…

PMP--二模--解题--61-70

文章目录 4.整合管理61、 [单选] 为解决具有挑战性的客户请求&#xff0c;启动了一个项目。该项目必须在短时间内交付。项目经理应该怎么做来尽可能提高项目的成功率&#xff1f; 14.敏捷--MVP--最小可行产品--使用最小可行产品获得客户尽早地反馈。完整性和交付是主观的。团队…

大模型之RAG-基于向量检索的理论与实战,对比关键字检索方案

前言 RAG系列的讲解&#xff0c;我们之前和大家分享了RAG的流程、文档切分、基于关键字检索的方案。 在关键字检索的认识与实战一文中&#xff0c;我们讲到了基于关键字检索的局限性&#xff1a;关键字检索可能会受到一些问题的影响&#xff0c;例如同义词、拼写错误等&#…

LeetCode题练习与总结:回文链表--234

一、题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#x…