算术运算符
需求分析
表达式求值的一种算法称为“算符优先法”,即定义算符之间的优先关系,在求解过程中,通过比较算符之间的优先关系,最终获得表达式的求解结果。
(1)以字符序列的形式从终端输入语法正确的、不含变量的任意位正浮点数表达式。
(2)根据表1给出的算符优先关系进行运算,且输入的算符只包含表中这7种。
(3)运算任意位正浮点数的算术四则混合运算表达式,得出结果并输出。
抽象数据类型
ADT Stack
{
数据对象:
数据关系:
基本操作:
InitStack(&S)
操作结果:构造一个空栈S。
Push(&S,e)
初始条件:栈S存在
操作结果:插入元素e为新的栈顶元素。
Gettop(&S)
初始条件:栈S已存在并且非空
操作结果:用e返回栈顶元素。
Pop(&S,&e)
初始条件:栈S已存在并且非空
操作结果:删除S的栈顶元素,并用e返回其值。
EvaluateExpression()
操作结果:计算最终的结构并且返回其值。
}ADT Stack
ADT Arithmetic
{
数据对象:
基本操作:
Zhuanhuan(a)
初始条件:a为字符串
操作结果:a转换为浮点数并返回。
In( c)
操作结果:判断字符c是否为符号。是返回TRUE,不是返回FALSE
Precede(a,b)
操作结果:比较a,b的优先顺序。返回”>””<”或”=”三种字符串。
Operate(a,theta,b)
操作结果:运算,其中a,b为数字,theta为符号。
EvaluateExpression()
操作结果:计算最终的结构并且返回其值。
}ADT Arithmetic
模拟运行过程
代码
#include<iostream>
#include<string>
#include <sstream>
#include<stdlib.h>
#pragma warning(disable:4996)
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
using namespace std;
typedef int Status;
typedef struct SNode {
string data;
struct SNode *next;
} SNode;
typedef struct node
{
SNode* top;
int count;
}*LinkStack;
//构造一个空栈
Status InitStack(LinkStack &S) {
S = new node();
S->top = NULL;
S->count = 0;
return TRUE;
}
//插入e
Status Push(LinkStack &S, string e) {
SNode *p = new SNode();
if (!p) {
return OVERFLOW;
}
p->data = e;
p->next = S->top;
S->top = p;
S->count++;
return TRUE;
}
//用e返回S的栈元素
stri