算术表达式求值演示

问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。

基本要求:以字符序列的形式从键盘输入语法正确的,不含变量的整型表达式。利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例3.1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

测试数据:3*(7-2)

1+2+3+4

88-1*5

1024/4*8

1024/(4*8)

(20+2)*(6/2)

3-3-3

8/(9-9)

2*(6+2*(3+6*(6+6)))

(((6+6)*6+3)*2+6)*2

实现提示:(1)设置运算符栈和运算数栈辅助分析算符优先关系。

(2)在读入表达式的字符序列的同时,完成运算符和运算数(整数)的识别处理,以及相应的运算。

(3)在识别出运算数的同时,要将其字符序列形式转换成整数形式。

(4)在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容。

选作内容:(1)扩充运算符集合,如增加乘方、一元减和赋值等运算。

(2)运算量可以是变量。

(3)运算量可以是实数类型。

(4)计算器的功能和仿真界面。

stack.h

#pragma once#define STACK_TEST
#ifdef STACK_TEST#ifdef __cplusplus
extern "C" {#endif // __cpluscplusstruct StackNode{struct StackNode* next;};struct LStack{struct StackNode header;int size;};typedef void* LinkStack;// 采用头插法push元素LinkStack Init();void Push(LinkStack stack, void* data);void Pop(LinkStack stack);void* Top(LinkStack stack);int Size(LinkStack stack);void Destroy(LinkStack stack);bool Empty(LinkStack stack);#ifdef __cplusplus
}
#endif // __cplusplus#endif // STACK

stack.cpp

#include <iostream>#include "stack.h"LinkStack Init()
{struct LStack* stack = (struct LStack*)malloc(sizeof(struct LStack));if (NULL == stack) return NULL;stack->header.next = NULL;stack->size = 0;}void Push(LinkStack stack, void* data)
{if (NULL == stack) return;if (NULL == data) return;struct LStack* linkStack = (struct LStack*)stack;struct StackNode* node = (struct StackNode*)data;node->next = linkStack->header.next;linkStack->header.next = node;linkStack->size++;
}void Pop(LinkStack stack)
{if (NULL == stack) return;struct LStack* linkStack = (struct LStack*)stack;if (linkStack->size == 0) return;struct StackNode* pDel = linkStack->header.next;linkStack->header.next = pDel->next;linkStack->size--;
}void* Top(LinkStack stack)
{if (NULL == stack) return NULL;struct LStack* linkStack = (struct LStack*)stack;return linkStack->header.next;
}int Size(LinkStack stack)
{if (NULL == stack) return -1;return ((struct LStack*)stack)->size;
}void Destroy(LinkStack stack)
{if (NULL == stack) return;free(stack);
}bool Empty(LinkStack stack)
{return Size(stack) > 0;
}

expr.h

#pragma once#include "stack.h"// + - * / ( )#
const char expr_table[7][7] = {{ '>', '>', '<', '<', '<', '>', '>'},{ '>', '>', '<', '<', '<', '>',   '>'},{ '>', '>', '>', '>', '<', '>', '>'},{ '>', '>', '>', '>', '<', '>', '>'},{ '<', '<', '<', '<', '<', '=', '\0'},{ '>', '>', '>', '>', '\0', '>', '>'},{ '<', '<', '<', '<', '<', '\0', '='}
};int expr_label(char ch);bool is_numeric(char ch);
char get_top(struct LStack* stack);void pop(struct LStack* stack, char* ch);
void pop(struct LStack* stack, double* val);
void pop(struct LStack* stack);
void push(struct LStack* stack, char ch);
void push(struct LStack* stack, double val);
char Precede(char ch1, char ch2);
double Operate(double a, char expr, double b);double EvaluateExpression();

expr.cpp

#include <iostream>#include "expr.h"
#include "stack.h"using namespace std;struct CharType
{struct StackNode node;char ch;
};struct NumType
{struct StackNode node;double val;
};int expr_label(char ch)
{int i = -1;switch (ch){case '+':i = 0;break;case '-':i = 1;break;case '*':i = 2;break;case '/':i = 3;break;case '(':i = 4;break;case ')':i = 5;break;case '#':i = 6;break;}return i;
}bool is_numeric(char ch)
{return '0' <= ch && ch <= '9';
}char get_top(struct LStack* stack)
{return ((struct CharType*)Top(stack))->ch;
}void pop(struct LStack* stack, char* ch)
{*ch = ((struct CharType*)Top(stack))->ch;Pop(stack);
}void pop(struct LStack* stack, double* val)
{*val = ((struct NumType*)Top(stack))->val;Pop(stack);
}void pop(struct LStack* stack)
{Pop(stack);
}void push(struct LStack* stack, char ch)
{struct CharType* data = new CharType;data->ch = ch;Push(stack, data);
}void push(struct LStack* stack, double val)
{struct NumType* data = new NumType;data->val = val;Push(stack, data);
}char Precede(char ch1, char ch2)
{return expr_table[expr_label(ch1)][expr_label(ch2)];
}double Operate(double a, char expr, double b)
{double ans = 0;switch (expr){case '+':ans = a + b;break;case '-':ans = a - b;break;case '*':ans = a * b;break;case '/':if (!b){cout << "除数不能为0!!!" << endl;exit(-1);}ans = a / b;break;}return ans;
}double EvaluateExpression()
{struct LStack* OPND = (struct LStack*)Init();struct LStack* OPTR = (struct LStack*)Init();char ch;int flag = 0;push(OPTR, '#');cin >> ch;while (ch != '#' || get_top(OPTR) != '#'){if (is_numeric(ch)){double num = (double)(ch - '0');if (!flag)push(OPND, num);else{double tmp = ((struct NumType*)Top(OPND))->val;((struct NumType*)Top(OPND))->val = tmp * 10 + num;}flag = 1;cin >> ch;}else{flag = 0;switch (Precede(get_top(OPTR), ch)){case '<':push(OPTR, ch);cin >> ch;break;case '>':char theta;pop(OPTR, &theta);double a,b; pop(OPND, &b);pop(OPND, &a);push(OPND, Operate(a, theta, b));break;case '=':pop(OPTR);cin >> ch;break;default:cout << "illegal expression" << endl;exit(-1);break;}}}return ((struct NumType*)Top(OPND))->val;
}

main.cpp

#include <iostream>#include "expr.h"using namespace std;void banner()
{cout << "##############################################################" << endl;cout << "                     实验三 算术表达式求值演示                 " << endl;cout << "##############################################################" << endl;
}int main()
{banner();cout << "\n\tPlease input a expression(end with '#'): " << endl;int ans = EvaluateExpression();cout << "The answer is  " << ans << endl;return EXIT_SUCCESS;
}

结语

选做内容有空更新

算术表达式求值演示(C/C++实现)相关推荐

  1. c语言作业算术表达式求值,算术表达式求值演示(C语言版)

    //头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...

  2. 算术表达式求值(C语言栈)

    题目:算术表达式求值 题目描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子.设计一个程序,演示用运算符优先法对算数表达式求值的过程. 基本要求:以字符序列的形式从终端输入语 ...

  3. boost::proto模块实现简单的算术表达式求值器的测试程序

    boost::proto模块实现简单的算术表达式求值器的测试程序 实现功能 C++实现代码 实现功能 boost::proto模块实现简单的算术表达式求值器的测试程序 C++实现代码 #include ...

  4. 数据结构—— 基于二叉树的算术表达式求值

    实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...

  5. 【Java】基于栈的算术表达式求值

    定义异常类 public class ExpressionException extends RuntimeException {private static final long serialVer ...

  6. 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值

    [题目链接] ybt 1397:简单算术表达式求值 OpenJudge NOI 1.12 01:简单算术表达式求值 [题目考点] 1. 函数 2. 选择结构 [解题思路] 这一章节都是练习函数,那么这 ...

  7. 信息学奥赛一本通(1397:简单算术表达式求值)

    1397:简单算术表达式求值 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 13874     通过数: 10359 [题目描述] 两位正整数的简单算术运算(只考 ...

  8. 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法

    想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西.现在看看...还挺简单的... 重点在于如何解析由括号.运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作.利用了两个栈( ...

  9. 用算符优先法对算术表达式求值(六)

    18.11.23 这是一道最近刚上的实验课的题目.... 基于C语言,欢迎指正 实验要求 掌握栈在解决实际问题中的应用,设计一个程序,演算用算符优先法对算术表达式求值的过程,利用算符优先关系,实现对算 ...

最新文章

  1. python调用c静态库,静态库(.lib)到Python项目
  2. MySQL忘记root密码不重启mysqld的方法
  3. Spring Boot中使用JSP
  4. 数据结构之堆Heap
  5. SQL之rand,round,floor,ceiling,cast小数处理函数
  6. NOIP训练营集训笔记—信息学基础算法(倍增与分治算法
  7. css复选框如何调大一些,创建CSS放大复选框
  8. 【浏览器】Firefox插件AdblockPlus屏蔽广告
  9. Docker安装与启动
  10. 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
  11. C++:定义头文件/定义命名空间
  12. win10开机密码忘记怎么办|win10登陆密码忘记解决方法
  13. oracle11g怎么打开oem,oracle11g启动OEM
  14. win10系统任务栏卡死
  15. 安卓系统中默认打开蓝牙 HCI snoop 文件的方法
  16. android+手机运行卡,手机运行卡顿,运行内存太小,在购买的时候就需要注意运行速度...
  17. 用Bootstrap写一份简历
  18. 司普沃浅谈荔枝种植技术与管理
  19. Perl 旁站查询(站长工具提取)
  20. HTTP协议版本介绍以及使用Wireshark工具针对HTTP进行抓包分析详解

热门文章

  1. 金泰克/tigo S300 240G SM225K H27QFG8PEM5R 完整开盘教程
  2. HDU - 1859 最小长方形
  3. steam好友服务器当前处于离线状态,steam怎么修改在线状态-steam设置离线、想交易、隐身等状态的方法 - 河东软件园...
  4. 记账APP:小哈记账2——注册页面的制作
  5. 《C++ Primer Plus》第八章习题与参考答案
  6. 手机与电脑局域网内数据互通
  7. 数据分析案例-文本挖掘与中文文本的统计分析
  8. MySQL: 备份 导入备份
  9. 配置软件仓库 Yum/dnf
  10. Linux下挂载NTFS分区