数据结构:c++算术表达式求值

本文介绍如何使用C++编程实现算术表达式的求值,采用运算符优先法,通过两个栈分别存储操作数和运算符。重点在于处理运算符优先级,并通过ASCII码判断输入类型。代码中包含详细解释。
摘要由CSDN通过智能技术生成

算术表达式求值

[问题描述]  一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正实数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“运算符优先法”求算术表达式的值。

解题思路
1.首先建立两个栈用来分别存储操作数(operand)以及运算符(operator),为了减少代码量就直接调用STL中的栈方法来对“入栈”“出栈”以及“访问栈顶元素”进行操作。
2.最重要的一点是“如何才能使表达试正确遵循运算法则”(先乘除后加减,先算括号内的再处理括号外的),这就涉及到运算符优先级的问题,即在 Precede()方法中用二维数组定义好运算符的优先关系,然后根据方法返回的结果进行不同的操作。
3.最后是关于输入问题,操作数和运算符都只用字符型来输入,然后通过字符的ASCII码值来区分是是操作数还是运算符,然后正确进栈。

下面直接上代码,代码中有详细解释

#include<iostream>
#include<stack>
#include<cmath>
using namespace std;
stack<char>OPTR;
stack<double>OPND;
typedef struct {
   //因为在输入表达式时是一个一个的输入字符,而操作数若长度大于2则无法正确得到操作数,因此该结构是用来存储一个完整的字符数,便于在CharTOInt()中将其转换为数字
 char data[10];
 int length;
}haha;
bool In(char ch)//判断输入的是不是运算符,若是则返回true
{
   
 if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')'||ch=='#')
 {
   
  return true;
 }
 else return false;
}
char Precede(char x, char y)//运算符优先级的判断
{
   
 int ang[2];
 char opnd[2] = {
    x,y };
 char aa[7][7] = {
   
     {
   '>','>','<','<','<','>','>'},
     {
   '>','>',
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值