利用栈来实现算术表达式求值的算法

2023-05-16

题目: 

      输入一个简单的算术表达式,并以“#”号结束。利用栈来实现算术表达式求值的算法 


 

输出结果: 

 


主要算法: 

 

char EvaluateExpression()
{//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈
	LinkStack OPND, OPTR;
	InitStack(OPND);           //初始化OPND栈
	InitStack(OPTR);           //初始化OPTR栈
	Push(OPTR,'#');            //将表达式起始符"#"压入OPTR栈
	char ch;
	cin >> ch;
	while (ch != '#' || GetTop(OPTR) != '#')    //表达式没有查找完毕或运算符栈的栈顶元素不为"#"
	{
	if (!In(ch)) {    
		Push(OPND, ch);                        //ch不是运算符就进操作数栈 
		cin >> ch;
	}
	else                                       //ch是运算符
		switch (Precede(GetTop(OPTR), ch))     //就比较运算符栈的栈顶元素和ch的优先级
		{
		case'<':                           //运算符栈顶元素优先级小,则将当前字符压入运算符栈
			Push(OPTR, ch);                     
			cin >> ch;                     //读入下一字符ch。
			break;
		case'>':                           //运算符栈顶元素优先级大,                              
			char theta, b, a;
			Pop(OPTR, theta);              //弹出运算符栈顶的运算符,
			Pop(OPND, b);                  //弹出操作数栈顶的两个运算数,
			Pop(OPND, a);
			Push(OPND, Operate(a, theta, b));//将运行结果压入操作数栈。
			break;
		case'=':                       //运算符栈的栈顶元素是"("且ch是")",
			char t;
			Pop(OPTR,t);               //弹出运算符栈顶的"(",
			cin >> ch;                 //读入下一字符。
			break;
		}
	}
	return GetTop(OPND);//操作数栈顶元素即是表达式求值结果
}

完整代码:

#include<iostream>
using namespace std;
typedef struct StackNode
{
	char data;
	struct StackNode *next;
}StackNode,*LinkStack;
int InitStack(LinkStack& S)
{
	S = NULL;
	return 1;
}
int Push(LinkStack& S, char e)
{
	LinkStack p = new StackNode;
	if (!p)
		exit(OVERFLOW);
	p->data = e;
	p->next = S;
	S = p;
	return 1;
} 
char GetTop(LinkStack& S)
{
	if (S == NULL)
		exit(1);
	else
		return S->data;
}
int Pop(LinkStack& S, char& e)
{
	if (S == NULL)
		return 0;
	e = S->data;
	LinkStack p = S;
	S = S->next;
	delete p;
	return 1;
}
int In(char ch) {
	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#')
		return 1;
	else
		return 0;
}
char Precede(char ch1, char ch2)
{
	char operation{};
	switch (ch1)
	{
	case'+':
	case'-':if (ch2 == '+' || ch2 == '-'||ch2==')'||ch2=='#')
		        operation = '>';
		    else
		        operation = '<';
		    break;
	case'*':
	case'/':if (ch2 == '(' )
		        operation = '<';
		    else
		        operation = '>';
		    break;
	case'(':if (ch2 == ')')
		        operation = '=';
		    else
		        operation = '<';
		    break;
	case')':
	         operation = '>';
		     break;
	case'#': 
		        operation = '<';
		    break;
	}
	return operation;
}
char Operate(char a, char operation, char b)
{
	char result{};
	switch (operation)
	{
	case'+':result= (a-'0') + (b-'0')+'0';
		    break;
	case'-':result = (a - '0') -(b - '0')+'0';
		break;
	case'*':result = (a - '0') * (b - '0')+'0';
		break;
	case'/':result = (a - '0') / (b - '0')+'0';
		break;
	}
	return result;
}

char EvaluateExpression()
{
	LinkStack OPND, OPTR;
	InitStack(OPND);
	InitStack(OPTR);
	Push(OPTR,'#');
	char ch;
	cin >> ch;
	while (ch != '#' || GetTop(OPTR) != '#')
	{
	if (!In(ch)) {
		Push(OPND, ch);
		cin >> ch;
	}
	else 
		switch (Precede(GetTop(OPTR), ch))
		{
		case'<':
			Push(OPTR, ch);
			cin >> ch;
			break;
		case'>':
			char theta, b, a;
			Pop(OPTR, theta);
			Pop(OPND, b);
			Pop(OPND, a);
			Push(OPND, Operate(a, theta, b));
			break;
		case'=':
			char t;
			Pop(OPTR,t);
			cin >> ch;
			break;
		}
	}
	return GetTop(OPND);
}

int main() {
	cout << "请输入一个算数表达式以#结尾:" << endl;
	char r;
	r = EvaluateExpression();
	int s = r - '0';
	cout << "结果为:" <<s;
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用栈来实现算术表达式求值的算法 的相关文章

  • Linux 1.debain 忘记root密码(修改root密码)2.debian 默认不允许 root 登录 解决办法 3.终端快捷键的设置 (超级详细)

    1 在开机引导时按e进入启动项编辑 2 将下图位置ro权限改为rw 在句末加入single init 61 bin bash如下图 3 按F10启动即可进入下图界面即可修改root密码 4 输入passwd root 如下图 5 重启即可
  • 解决Debian 11服务器不能以root用户远程ssh登录(解决方案)

    默认情况下将禁用Debian Linux上的root登录 1 安装ssh服务 sudo apt install openssh server 2 安装vim apt get install vim 3 用vim打开 etc ssh sshd
  • 记一次阿里云 CentOS 7.4 64位部署项目之redis

    1 下载安装源 注意此时下载的路径 wget http download redis io releases redis 4 0 8 tar gz 2 解压 tar xzvf redis 4 0 8 tar gz 3 开始安装 cd red
  • 4.25-5.1,创建修改文件目录,查看命令,查找命令,用户管理命令

    创建和修改文件和目录 修改文件所有者和权限 查看 创建链接 执行内容和目录搜索 cat 显示文件内容 xff08 不好用 xff09 tac 倒着显示nl 行号more 一页一页的显示文件内容less 可以翻页head 头搭配 ntail
  • CenTos 7.6 1810 重置root密码

    引导页面按 e 在UTF 8 后追加 init 61 bin sh Ctrl 43 x 进入单用户模式 mount o remount rw 挂载根目录 passwd root xff08 不使用小键盘 xff09 更新系统信息命令 tou
  • Ubuntu基础——网络配置+配置apt源(手把手教程)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 安装环境 xff1a Ubuntu22 04 一 xff1b 切换管理员模式 首先我们来到命令行输入su xff08 请注意命令的空格 x
  • 不建议单片机的IO口直接驱动直流电机

    实验目的 想通过单片机的PF9引脚pwm输出来调节直流马达速度 硬件连接 xff1a 直流马达的两个引脚一端接PF9 另一端接GND 实验现象 xff1a 直流电机不转 xff0c 但是用万用表测量PF9和地之间有电压 但是连上电机后 xf
  • Ubuntu系统进行复制粘贴文件显示没有权限的解决办法

    Ctrl 43 alt 43 T打开终端 输入命令sudo nautilus 然后就可以打开一个不需要管理员权限的界面 xff0c 可以直接复制粘贴 亲测有效 xff01 xff01 借鉴于博客 xff1a https blog csdn
  • Windows下Python安装twint的方法

    1 安装git xff0c 如果不安git工具 xff0c 用pip install twint安装出来的twint是运行不了的 Git Downloading Package git scm com 64位的链接https github
  • 初学Python,if __name__ == ‘__main__‘:

    if name 61 61 39 main 39 若是在当前文件 xff0c name 是 main 若是导入的文件 xff0c name 是模块名 这句话的意思就是 xff0c 当模块被直接运行时 xff0c 以下代码块将被运行 xff0
  • 初学Python,urllib实现翻译

    import urllib request import urllib parse import json import time url 61 34 https fanyi youdao com translate smartresult
  • PVE踩坑实录2设置无线网卡

    wifi设置 1 在https www wireshark org tools wpa psk html上面算出自己的wap psk 2 修改网卡设置 vi etc network interfaces auto wlp2s0 iface
  • A10-7860K试装DSM

    家里旧电脑一台 xff0c A10 7860K xff0c 想发挥下余热 xff0c 然后就是一周的尝试 终于暂时可以用如下配置启动 xff0c 无错误 PVE7 3 1 处理器host xff0c SeaBIOS xff0c 机型i440
  • 记一起和前端没什么卵关系的OPTION 405问题

    记一起和前端没什么卵关系的后端405问题 问题的关键点在于本来是POST请求 xff0c 会变成OPTION请求 xff0c 并且提示405报错 xff0c 会类似跨域 并且只有某些手机机型才会 xff08 如Oppo系列 xff09 其实
  • 单点登录 Oauth2认证 详解

    1 单点登录的特点是 xff1a 1 认证系统为独立的系统 2 各子系统通过Http或其它协议与认证系统通信 xff0c 完成用户认证 3 用户身份信息存储在Redis集群 Java中有很多用户认证的框架都可以实现单点登录 xff1a 1
  • 【JAVA】-JAVA简介

    目录 一 JAVA的简介 发展概述 语言的优势 二 JAVA的特性 一 JAVA的简介 发展概述 1 1 JAVA语言发展简史 Java 语言源于 1991 年 4 月 xff0c Sun 公司 James Gosling博士 领导的绿色计
  • SpringBoot整合mybatis-plus实现分页查询(建议收藏)

    一 前言 最近学习了SpringBoot分页查询的两种写法 xff0c 一种是手动实现 xff0c 另一种是使用框架实现 现在我将具体的实现流程分享一下 二 手动实现分页查询 先复习一下 xff0c SQL中的limit关键字 xff0c
  • MySQL 数据库 分组查询

    分组查询 xff1a 包括单列分组查询和多列分组查询 group by 单列分组查询 示例 xff1a 1 根据科目分组 xff0c 查询每个科目的平均分 2 根据班级分组 xff0c 查询每个班级成绩总数 3 根据班级分组 xff0c 查
  • JAVA http请求工具类

    原文 xff1a JAVA http请求工具类 月半花开的博客 CSDN博客 目录 1 第一种http requst 1 xff09 maven引入 2 xff09 Get请求请求示例 3 xff09 post请求请求示例 2 第二种hut
  • Weather API 天气应用 API调用分享

    Weather API 分享 链接 xff1a https openweathermap org api 注册默认是One Call API 3 0 适合学生项目练手 提供以下天气数据 xff1a 当前天气每小时 分钟预报48小时每小时预报

随机推荐

  • pip安装python包到指定路径

    1 2 我们可以先进入创建好的虚拟环境的site packages 我还没有尝试 xff1a
  • Kubernetes1.26.0部署(Ubuntu/CentOS)

    文章目录 前言准备工作准备5台虚拟机初始化操作Centos配置yum源配置免密 修改hostname 关闭防火墙 selinux 关闭swap分区 方便后面进行其它操作 下载软件包并批量安装配置时间同步配置打开文件描述符添加ipvs模块和内
  • 真正免费的天气API,无需注册申请key

    文章目录 1 中华万年历的天气API 2 讯飞语音识别内置的墨迹天气API 3 乐享天气APP 4 蚂蚁数据天气查询API接口 无聊整理的真正免费的天气API xff0c 无需注册申请key等 xff0c 当然部分数据解析需要自己理解下 x
  • rollup 打包报错

    RollupError Node tried to load your configuration file as CommonJS even though it is likely an ES module To resolve this
  • 视频4K技术的解读

    前几年4K技术就已经有人提及 xff0c 今年更是成了一个非常热门的词汇 xff0c 而且4K技术已经普遍应用于各类终端 xff0c 如电视机 机顶盒 手机等 那么如何来理解4K这个东东呢 xff1f 今天博主就谈谈自己对4K技术的认识 博
  • 字符串—练习题

    目录 案例 xff1a 拼接字符串 案例 xff1a 拼接字符串 案例 xff1a 统计字符串 案例 xff1a 字符串反转 案例 xff1a 字符串反转 案例 xff1a 拼接字符串 需求 xff1a 定义一个方法 xff0c 把int数
  • Anaconda配置环境变量 Windows11

    1 找到Anaconda的安装路径以备配置环境变量使用 2 复制一下路径 C ProgramData Anaconda3 C ProgramData Anaconda3 Scripts C ProgramData Anaconda3 Lib
  • 用rs_lidar雷达跑lio_sam

    1 准备工作 imu绑定串口有线连接雷达并能用rviz显示雷达点云用两个imu标定包标定imu在完成第二步必要的工作后 xff0c 配置LIO SAM config 下的params yaml参数 xff0c 更改之前建议备份在旁边复制粘贴
  • 如何从gitee上下载项目并运行

    前端界面 找到所要下载的项目 xff0c 点击克隆 下载 xff0c 并下载zip压缩包后解压 xff08 方法很多看个人习惯 xff0c 我觉得这样比较快 xff09 打开WebStrom xff0c 并找到刚刚下载的项目 xff0c 点
  • Springboot整合Mybatis-Plus

    1 概述 MyBatis Plus opens new window xff08 简称 MP xff09 是一个 MyBatis opens new window 的增强工具 xff0c 在 MyBatis 的基础上只做增强不做改变 xff
  • 初识C语言——第一个C语言程序(保姆级教程)

    1 创建一个项目 1 1 首先 xff0c 下载好适合的编译器 xff0c 此处用的是VS2017 此处点击空项目 此处有几个细节需要我们注意一下 xff1a 1 此处选择C 43 43 xff0c 空项目 xff0c C 43 43 对C
  • Ubuntu双系统扩大/home磁盘空间大小,gparted移动磁盘位置及大小

    前言 xff1a 笔者之前试过挂载磁盘的方法 xff0c 后开觉得不方便 xff0c 于是决定用U盘启动盘来扩大空间 xff0c 花了几个小时终于搞清楚了整个流程 xff0c 其中在gparted移动磁盘位置的地方卡了很长时间 xff0c
  • gitee码云仓库创建教程

    git码云 目录 1 注册账户 2 申请生成公钥 3 生成公钥 3 创建git仓库 4 remote Access denied 拒绝访问 fatal unable to access https gitee cohe requested
  • 如何使用Python的第三方库you-get下载视频

    安装步骤 1 Win 43 R打开cmd 2 输入指令下载第三方库you get xff0c 该第三方库可以用于下载视频 pip install you get 3 等到它显示 Successfully installed you get
  • 递归函数-求N阶乘

    递归函数 xff0c 就是指自己调用自己的函数 运用大事化小的思维 xff0c 将繁杂的流程简单化 想对比于循环思维 xff0c 递归函数显然让代码的利用率更高了 xff0c 因为0的阶乘是0 xff0c 所以这应该单独进行判断 xff0c
  • CDN如何添加加速域名和绑定CNAME

    摘要 xff1a 本文将手把手教你开通CDN服务 添加加速域名和绑定CNAME 步骤 1 xff1a 开通CDN服务 在阿里云官网CDN产品详情页快速了解产品 xff0c 之后单击 立即开通 在订购页面选择适合计费方式 xff0c 确认订单
  • 将两个递增的有序链表合并为一个递增的有序链表.【数据结构】【线性表】

    编写一个函数完成如下功能 xff1a 将两个递增的有序链表合并为一个递增的有序链表 要求结果链表仍使用原来的链表空间 xff0c 不另外占用其他的存储空间 表中不允许有重复的数据 要求 xff0c 在主函数中调用上面的函数测试 提示 xff
  • 将一个带头结点的单链表分解为两个具有相同构造的链表B和C

    编写一个函数完成如下功能 xff1a 将一个带头结点的单链表分解为两个具有相同构造的链表B和C xff0c 其中B表的节点为A表中值小于0的节点 xff0c 而C表的节点为A表中值大于0的节点 xff08 链表A中的元素为非零整数 xff0
  • 假设以数组Q[M]存放循环队列中的元素,同时设置一个标志tag,以tag==0和tag==1来区分在队头指针(front)和队尾指针(rear)相等时,队列状态是“空”还是“满”。【队列】

    假设以数组Q M 存放循环队列中的元素 xff0c 同时设置一个标志tag xff0c 以tag 61 61 0和tag 61 61 1来区分在队头指针 xff08 front xff09 和队尾指针 xff08 rear xff09 相等
  • 利用栈来实现算术表达式求值的算法

    题目 xff1a 输入一个简单的算术表达式 xff0c 并以 号结束 利用栈来实现算术表达式求值的算法 输出结果 xff1a 主要算法 xff1a char EvaluateExpression 算术表达式求值的算符优先算法 xff0c 设