【 第1关:基于栈的中缀算术表达式求值】【编程题实训-栈】【头歌】【bjfu-240】

这篇具有很好参考价值的文章主要介绍了【 第1关:基于栈的中缀算术表达式求值】【编程题实训-栈】【头歌】【bjfu-240】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务描述

本关任务:输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)

编程要求

输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。参加运算的数为double类型。

输出
对于每组数据输出一行,为表达式的运算结果。输出保留两位小数。

测试说明
平台会对你编写的代码进行测试:

测试输入:

2+2=
20*(4.5-3)=
=

预期输出:

4.00
30.00

来源
https://www.bjfuacm.com/

C++代码

240 head.h

#include <iostream>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;


typedef struct
{//符号栈
	char* base;
	char* top;
	int stacksize;
}SqStack1;


int InitStack1(SqStack1& S)
{//符号栈初始化
	S.base=new char[MAXSIZE];
    if (!S.base) exit (OVERFLOW);
    S.top=S.base;
    S.stacksize=MAXSIZE;
	return OK;
}
int Push1(SqStack1& S, char e)
{//符号栈入栈
	if (S.top-S.base==MAXSIZE)
        return ERROR;
    *S.top++=e;//元素e入栈
	return OK;
}
int Pop1(SqStack1& S)
{//符号栈出栈
	char e;
    if (S.top==S.base) return ERROR;
    e=*--S.top;
	return OK;
}
char GetTop1(SqStack1 S)
{//符号栈取栈顶元素
	char e;
    if (S.top==S.base) return ERROR;
    e=*(S.top-1);
	return e;
}
typedef struct
{//数字栈
	double* base;
	double* top;
	int  stacksize;
}SqStack2;
int InitStack2(SqStack2& S)
{//数字栈初始化
    S.base=new double[MAXSIZE];
    if (!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=MAXSIZE;
	
	return OK;
}
int Push2(SqStack2& S, double e)
{//数字栈入栈
	if (S.top-S.base==MAXSIZE)//栈满
    return ERROR;
    *S.top++=e;//e入栈
	return OK;
}
int Pop2(SqStack2& S)
{//数字栈出栈
	    double e;
    if (S.top == S.base) return ERROR;
    e = *--S.top;
	return OK;
}
double GetTop2(SqStack2 S)
{//数字栈取栈顶元素
	double e;
    if (S.top == S.base) return ERROR;
    e = *(S.top - 1);
    return e;
}
double Calculate(double a, char op, double b)
{//算术表达式的求值		a在前,b在后
    switch(op)
    {
    case '+':return a+b;
    break;
    case '-':return (a-b);
    break;
    case '*':return(a*b);
    break;
    case '/':return(a/b);
    break;
    }
   
}
char Precede(char theta1, char theta2)
{//比较符号优先级
	if ((theta1 == '(' && theta2 == ')') || (theta1 == '=' && theta2 == '=')) {
		return '=';
	} else if (theta1 == '(' || theta1 == '=' || theta2 == '(' || (theta1
			== '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/')) {
		return '<';
	} else
		return '>';
}

(主函数文件不可编辑)文章来源地址https://www.toymoban.com/news/detail-739723.html

#include "head.h"
int main()
{
	char s[100];
	while(cin>>s)
	{
		if(s[0]=='=') break;
		SqStack1 op;
		InitStack1(op);
		SqStack2 data;
		InitStack2(data);
		Push1(op,'=');
		//提前在符号栈中放入'=',便于以后比较符号优先级
		int i,x=0,e=0,flag=0;
		//x和e辅助存储double型数据
		//flag用于判断某个double类型数据是否处理完,1表示未完成,0表示完成
		for(i=0;s[i]!='\0';i++)
		{
			if('0'<=s[i]&&s[i]<='9')
			{
				flag=1;
				x=x*10+(s[i]-'0');//x存储去掉小数点的数据,如原数据1.23,最终得到的x为123
				if(e!=0) e=e*10;//小数点后有几位,e扩大为10的几倍
			}
			else if(s[i]=='.')
				e=1;
			else
			{
				if(flag!=0)
				{
					double number=x;
					if(e!=0) number=number/e;
					//如果其间有小数点出现,number缩小对应的倍数
					Push2(data,number);//将double类型数据入栈
					x=e=flag=0;//复原x、e、flag
				}
				while(1)
				{
					if(Precede(GetTop1(op),s[i])=='<')
					{//符号栈栈顶元素优先级低于当前符号,将当前符号入栈
						Push1(op,s[i]);
						break;
					}
					else if(Precede(GetTop1(op),s[i])=='>')
					{//符号栈栈顶元素优先级高于当前符号,出栈计算,所得结果重新入栈
						double b=GetTop2(data);
						Pop2(data);
						double a=GetTop2(data);
						Pop2(data);//将数字栈顶端的两个元素出栈
						char oper=GetTop1(op);
						Pop1(op);//将符号栈顶端的一个符号出栈
						Push2(data,Calculate(a,oper,b));//将运算结果压入数字栈
					}
					else
					{//其余情况时,将符号栈栈顶元素出栈
						Pop1(op);
						break;
					}
				}
			}
		}
		printf("%.2f\n",GetTop2(data));
	}
	return 0;
}

到了这里,关于【 第1关:基于栈的中缀算术表达式求值】【编程题实训-栈】【头歌】【bjfu-240】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 数据结构 栈 中缀表达式转后缀表达式并求值

    写在前面,这里用的是我自己写的Stack类,并非STL,实现方法为静态数组,但使用过程中的函数方法一样,无伤大雅。(完整code和Stack_static类赋在最后) 1.从左到右遍历 2.数,即参与运算数,直接放进后缀表达式之后 3.左括号 ,直接压入栈(因为括号的优先级最高,无需判断

    2024年02月03日
    浏览(49)
  • 4.2 实现基于栈的表达式求值计算器(难度4/10)

    本作业主要考察:解释器模式的实现思想/栈结构在表达式求值方面的绝对优势 C++数据结构与算法夯实基础作业列表 通过栈的应用,理解特定领域设计的关键作用,给大家眼前一亮的感觉。深刻理解计算机语言和人类语言完美结合的杰作。是作业中的上等作品,是数据结构与

    2024年02月10日
    浏览(35)
  • 【表达式求值】整型提升和算术转换

    目录 1. 整型提升 1.1整型提升的意义: 1.2如何进行整体提升呢? 2. 算术转换 3. 问题表达式解析 3.1 表达式1 3.2 表达式2 3.3 表达式3 3.4 表达式4 4. 操作符属性 ​ 总结: C语言中 整型算术运算 总是至少以整型类型的精度来进行的。 为了获得这个精度,表达式中的 字符和短整型

    2024年02月21日
    浏览(37)
  • 简易计算器(详解用栈实现算术表达式求值)

    [问题描述] 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是 正实数 ,运算符只含 加减乘除 等四种运算符,界限符只含 左右括号 如:6+15*(21-8/4)。编程利用“ 运算符优先法 ”求算术表达式的值。 [基本要求] (1)读入一个合法的

    2024年02月08日
    浏览(51)
  • Java LeetCode篇-深入了解关于栈的经典解法(栈实现:中缀表达式转后缀)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍     文章目录         1.0 中缀表达式转后缀说明         1.1 实现中缀表达式转后缀思路         2.0 逆波兰表达式求值         2.1 实现逆波兰表达式求值思路         3.0 有效的括号         3.1 实现有

    2024年02月04日
    浏览(60)
  • 数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

    🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:Aileen_0v0🧸—CSDN博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:Aileen_0v0🧸

    2024年02月07日
    浏览(53)
  • 栈的OJ题(逆波兰表达式求值+括号匹配+出入栈顺序匹配+最小栈)

    平时使用是算式是中缀表达式 逆波兰表达式是一种后缀表达式,算符写在后面。 优点: 1.去掉括号后表达式无歧义 2.适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中 3.中缀转后缀:加上括号,将对应的运算符放在括号外 1.题

    2024年02月08日
    浏览(50)
  • 中缀表达式转后缀表达式

      一种不需要括号的后缀表达法,也把它称为 逆波兰 表示,是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法。   中缀表达式指的是“9+(3-1)×3+8÷2”,这种就是我们通常见到的书写算式顺序,要计算中缀表达式则首先要将字符串转换为后缀表达式,即

    2023年04月08日
    浏览(47)
  • 数据结构——基于二叉树的表达式求值算法

    1.输入一个表达式(表达式中的数均小于10的正整数),利用二叉树来表示该表达式,创建表达式数,然后利用二叉树的遍历操作求表达式的值。 2.输入要求:多组数据,每组数据1行,为一个表达式,表达式以“=”结尾。当输入只有一个“=”时,输入结束。 3.输出要求:每组

    2024年02月04日
    浏览(47)
  • 【数据结构与算法】【12】前缀表达式、中缀表达式、后缀表达式

    什么是前缀表达式、中缀表达式、后缀表达式 前缀表达式、中缀表达式、后缀表达式,是通过树来存储和计算表达式的三种不同方式 以如下公式为例 ( a + ( b − c ) ) ∗ d ( a+(b-c) )*d ( a + ( b − c ) ) ∗ d 通过树来存储该公式,可以表示为 那么问题就来了,树只是一种抽象的数据

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包