算术表达式求值演示(C/C++实现)
算术表达式求值演示
问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。
基本要求:以字符序列的形式从键盘输入语法正确的,不含变量的整型表达式。利用教科书表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++实现)相关推荐
- c语言作业算术表达式求值,算术表达式求值演示(C语言版)
//头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...
- 算术表达式求值(C语言栈)
题目:算术表达式求值 题目描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子.设计一个程序,演示用运算符优先法对算数表达式求值的过程. 基本要求:以字符序列的形式从终端输入语 ...
- boost::proto模块实现简单的算术表达式求值器的测试程序
boost::proto模块实现简单的算术表达式求值器的测试程序 实现功能 C++实现代码 实现功能 boost::proto模块实现简单的算术表达式求值器的测试程序 C++实现代码 #include ...
- 数据结构—— 基于二叉树的算术表达式求值
实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...
- 【Java】基于栈的算术表达式求值
定义异常类 public class ExpressionException extends RuntimeException {private static final long serialVer ...
- 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值
[题目链接] ybt 1397:简单算术表达式求值 OpenJudge NOI 1.12 01:简单算术表达式求值 [题目考点] 1. 函数 2. 选择结构 [解题思路] 这一章节都是练习函数,那么这 ...
- 信息学奥赛一本通(1397:简单算术表达式求值)
1397:简单算术表达式求值 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 13874 通过数: 10359 [题目描述] 两位正整数的简单算术运算(只考 ...
- 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法
想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西.现在看看...还挺简单的... 重点在于如何解析由括号.运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作.利用了两个栈( ...
- 用算符优先法对算术表达式求值(六)
18.11.23 这是一道最近刚上的实验课的题目.... 基于C语言,欢迎指正 实验要求 掌握栈在解决实际问题中的应用,设计一个程序,演算用算符优先法对算术表达式求值的过程,利用算符优先关系,实现对算 ...
最新文章
- python调用c静态库,静态库(.lib)到Python项目
- MySQL忘记root密码不重启mysqld的方法
- Spring Boot中使用JSP
- 数据结构之堆Heap
- SQL之rand,round,floor,ceiling,cast小数处理函数
- NOIP训练营集训笔记—信息学基础算法(倍增与分治算法
- css复选框如何调大一些,创建CSS放大复选框
- 【浏览器】Firefox插件AdblockPlus屏蔽广告
- Docker安装与启动
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
- C++:定义头文件/定义命名空间
- win10开机密码忘记怎么办|win10登陆密码忘记解决方法
- oracle11g怎么打开oem,oracle11g启动OEM
- win10系统任务栏卡死
- 安卓系统中默认打开蓝牙 HCI snoop 文件的方法
- android+手机运行卡,手机运行卡顿,运行内存太小,在购买的时候就需要注意运行速度...
- 用Bootstrap写一份简历
- 司普沃浅谈荔枝种植技术与管理
- Perl 旁站查询(站长工具提取)
- HTTP协议版本介绍以及使用Wireshark工具针对HTTP进行抓包分析详解
热门文章
- 金泰克/tigo S300 240G SM225K H27QFG8PEM5R 完整开盘教程
- HDU - 1859 最小长方形
- steam好友服务器当前处于离线状态,steam怎么修改在线状态-steam设置离线、想交易、隐身等状态的方法 - 河东软件园...
- 记账APP:小哈记账2——注册页面的制作
- 《C++ Primer Plus》第八章习题与参考答案
- 手机与电脑局域网内数据互通
- 数据分析案例-文本挖掘与中文文本的统计分析
- MySQL: 备份 导入备份
- 配置软件仓库 Yum/dnf
- Linux下挂载NTFS分区