算术表达式求值的程序设计与实现_数据结构课程设计
以下内容可且仅可供参考,如有错误欢迎指正。
部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉
《算术表达式求值的程序设计与实现》题目要求
1、问题描述
从键盘上输入中缀算术表达式,包括圆括号,计算出表达式的值。
2、设计要求
实现不含变量的整数表达式的算术四则混合运算(+、-、*和/)。
3、数据结构
本课题代码实现使用的数据结构为顺序栈。
目录
1 程序目标及问题分析
1.1问题描述
1.2问题分析
2 系统功能设计
2.1系统功能模块
2.2 系统流程图
3 程序主要数据结构及函数列表
3.1 程序中使用的数据结构
3.2 函数列表
4 程序代码及运行结果
4.1程序代码
4.2 运行结果
5调试与测试
6课程设计总结与体会
参考文献:
1 程序目标及问题分析
1.1问题描述
1.2问题分析
2 系统功能设计
2.1系统功能模块
接收算数表达式,根据判断优先级函数返回值选择后续操作并输出结果。
2.2 系统流程图
3 程序主要数据结构及函数列表
3.1 程序中使用的数据结构
表达式求值算法在使用栈的过程中元素个数变化较小,故使用顺序栈实现。
程序中定义了结构体变量OPTR和OPND分别存放运算符和操作数,结构体变量中包含三个元素,指向栈底的指针base,指向栈顶的指针top和存放当前顺序栈可使用的最大容量,定义如下所示:
typedef struct { //寄存运算符char* base; //栈底指针char* top; //栈顶指针int stacksize; //当前可使用最大容量}OPTR;typedef struct { //寄存操作数double* base;double* top;int stacksize;}OPND;
3.2 函数列表
int InitStack(OPTR* s);int InitStack(OPND* s);
int Push(OPTR* s, char e);int Push(OPND* s, double e);
int Pop(OPTR* s, char* e);int Pop(OPND* s, double* e);
char Gettop(OPTR* s);double Gettop(OPND* s);
int In(char e);
实现功能:判断字符类型为运算符或操作数,运算符返回值为1,操作数返回值为0;
char Precede(char a, char b);
double Operate(double a, double b, char t);
int main();
实现功能:接收用户输入字符并根据优先级函数返回值选择后续操作,并输出运算结果。
4 程序代码及运行结果
4.1程序代码
#include<stdio.h>#include<stdlib.h>#define STACK_SIZE 10 //存储空间初始分配量#define STACK_INCREASE 5 //存储空间分配增量typedef struct { //寄存运算符char* base; //栈底指针char* top; //栈顶指针int stacksize; //当前可使用最大容量}OPTR;typedef struct { //寄存操作数double* base;double* top;int stacksize;}OPND;int InitStack(OPTR* s);int InitStack(OPND* s);int Push(OPTR* s, char e);int Push(OPND* s, double e);int Pop(OPTR* s, char* e);int Pop(OPND* s, double* e);char Gettop(OPTR* s);double Gettop(OPND* s);int In(char e);char Precede(char a, char b);double Operate(double a, double b, char t);//主函数int main(){OPTR optr;OPND opnd;OPND temp; //临时存储数字,构造多位数char c; //接收表达式char y; //接收脱掉的括号和井号char theta; //接收脱出进行运算的运算符double a, b; //接收脱出进行运算的操作数int g = 1;while(g){system("cls");printf("1运行计算器 0退出程序");scanf("%d",&g);getchar();if(g){ double x = 0, z = 0; //多位数转换int n = 1; //幂int error = 0; //输入格式错误则报错InitStack(&optr);InitStack(&opnd);InitStack(&temp);printf("请输入整数表达式(以#结束):\n");Push(&optr, '#');c = getchar();while (c != '#' || Gettop(&optr) != '#'){if (c == '0') {Push(&opnd, (double)z);c = getchar();}else{while (!In(c)){ //将多位数存入临时栈Push(&temp, c - '0'); //字符转数字c = getchar();}while (temp.base != temp.top){ //将临时栈中的数重组为多位数Pop(&temp, &x);z = z + x * n;n *= 10;}n = 1;if (z)Push(&opnd, (double)z);//重组后的多位数入栈z = 0;}if (In(c)){switch (Precede(Gettop(&optr), c)){case '<':Push(&optr, c);c = getchar();break;case '=':Pop(&optr, &y);c = getchar();break;case '>':Pop(&optr, &theta);Pop(&opnd, &b);Pop(&opnd, &a);Push(&opnd, Operate(a, b, theta));break;case '!':printf("输入错误!");error = 1;break;}}if (error)break;}if (!error)printf("结果为:%.2f\n", Gettop(&opnd));system("pause");}else break; }return 0;}//构造空栈sint InitStack(OPTR* s) {s->base = (char*)malloc(STACK_SIZE * sizeof(char));if (!s->base)exit(0);//存储分配失败s->top = s->base;s->stacksize = STACK_SIZE;return 1;}int InitStack(OPND* s) {s->base = (double*)malloc(STACK_SIZE * sizeof(double));if (!s->base)exit(0);s->top = s->base;s->stacksize = STACK_SIZE;return 1;}//插入元素e为新的栈顶int Push(OPTR* s, char e) {if (s->top - s->base >= s->stacksize) {//栈满,追加存储空间s->base = (char*)realloc(s->base,(s->stacksize + STACK_INCREASE) * sizeof(char));if (!s->base)exit(0);s->top = s->base + s->stacksize;s->stacksize += STACK_INCREASE;}*(s->top) = e;s->top++;}int Push(OPND* s, double e) {if (s->top - s->base >= s->stacksize) {s->base = (double*)realloc(s->base,(s->stacksize + STACK_INCREASE) * sizeof(double));if (!s->base)exit(0);s->top = s->base + s->stacksize;s->stacksize += STACK_INCREASE;}*(s->top) = e;s->top++;}//删除栈顶元素,返回其值int Pop(OPTR* s, char* e) {if (s->top == s->base)return 0;s->top--;*e = *(s->top);return 1;}int Pop(OPND* s, double* e) {if (s->top == s->base)return 0;s->top--;*e = *(s->top);return 1;}//判断栈是否为空,不为空则返回栈顶元素echar Gettop(OPTR* s) {if (s->top == s->base)return 0;char* e = s->top;e--;return *e;}double Gettop(OPND* s) {if (s->top == s->base)return 0;double* e = s->top;e--;return *e;}//判断是否为运算符int In(char e) {if (e == '+' || e == '-' || e == '*' || e == '/' || e == '(' || e == ')' || e == '#')return 1;else return 0;}//判断优先级char Precede(char a, char b) {if (a == '+'){if (b == '*' || b == '/' || b == '(') return '<';else return '>';}else if (a == '-'){if (b == '*' || b == '/' || b == '(') return '<';else return '>';}else if (a == '*'){if (b == '(')return '<';else return '>';}else if (a == '/'){if (b == '(')return '<';else return '>';}else if (a == '('){if (b == ')')return '=';else if (b == '#') return '!';else return '<';}else if (a == ')'){if (b == '(')return '!';else return '>';}else if (a == '#'){if (b == ')')return '!';if (b == '#')return '=';else return '<';}}//计算double Operate(double a, double b, char theta) {switch (theta){case '+':return a + b;case '-':return 1.0 * a - b;case '*':return a * b;case '/':if (b != 0)return 1.0 * a / b;elseprintf("输入错误!");exit(0);}}
4.2 运行结果
提示用户选择进行计算操作或退出程序,提示界面如图4-1所示。
输出用户输入表达式的计算结果并提示下一步操作,输出结果界面如图4-3所示。
5调试与测试
|
(3)当输入语法有错误时出现提示(‘)’‘(’、‘#’‘)’或‘(’‘#’相遇),提示界面如图5-3所示。
(4)当计算中出现除数为零情况出现提示,提示界面如图5-4所示。
6课程设计总结与体会
参考文献:
[1]严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2021.
部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉
算术表达式求值的程序设计与实现_数据结构课程设计相关推荐
- 家族关系查询系统程序设计算法思路_数据结构课程设计(家族关系查询系统)
1 课程设计介绍 1 . 1 课程设计项目简介 家谱就是一种以表谱形式 , 记载一个以血缘关系为主体得 家族世系繁衍与重要人物事迹得特殊图书载体.家谱就是中国特 有得文化遗产,就是中华民族得三大文献之 ...
- 家族关系查询系统程序设计算法思路_数据结构课程设计(家族关系查询系统)..doc...
数据结构课程设计(家族关系查询系统). 1 课程设计介绍 1.1课程设计项目简介 家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体.家谱是中国特有的文化遗产,是 ...
- 家族关系查询系统程序设计算法思路_数据结构课程设计(家族关系查询系统).....
家族关系查询系统 1 1 课程设计介绍 1.1 课程设计项目简介 家谱是一种以表谱形式, 记载一个以血缘关系为主体的家族世 系繁衍和重要人物事迹的特殊图书载体.家谱是中国特有的文化 遗产,是中华民族的 ...
- 家族关系查询系统程序设计算法思路_数据结构课程设计--
数据结构课程设计-- 家族关系查询系统 课 程 设 计 任 务 书 题目题目 家族关系查询系统家族关系查询系统 主要内容.基本要求.主要参考资料等主要内容.基本要求.主要参考资料等 主要内容主要内容 ...
- 家族关系查询系统程序设计算法思路_数据结构课程设计家族关系查询系统要点...
家族关系查询系统 1 课程设计介绍 1.1 课程设计项目简介 家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要 人物事迹的特殊图书载体. 家谱是中国特有的文化遗产, 是中华民族的三大 ...
- 算术表达式求值演示(C/C++实现)
算术表达式求值演示 问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的典型例子.设计一个程序,演示用算符优先法对算术表达式求值的过程. 基本要求:以字符序列的形式从键盘输入语法正确的 ...
- 算术表达式求值(C语言栈)
题目:算术表达式求值 题目描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子.设计一个程序,演示用运算符优先法对算数表达式求值的过程. 基本要求:以字符序列的形式从终端输入语 ...
- 【数据结构】栈的应用-算术表达式求值#数据结构实验任务书
实验题目:栈的应用-算术表达式求值 正文 实验环境: Visual C++ 2010 实验目的: 1.掌握栈的定义及实现: 2.掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3 ...
- c语言作业算术表达式求值,算术表达式求值演示(C语言版)
//头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...
最新文章
- 消息幂等(去重)通用解决方案
- python爬虫 发送定时气象预报
- python异常之ModuleNotFoundError: No module named ‘test01inner02‘
- rtems的GNU(GCC)编译环境配置
- 成功解决PackagesNotFoundError: The following packages are not available from current channels: tensorflo
- Linux Makefile 中的陷阱【转】
- ASP.NET Core Authentication and Authorization
- 我们正在下注:这个注解很快就会出现在JDK中
- 60usebean创建实例对象
- 【Makefile由浅入深完全学习记录1】认识make和makefile
- 从零开始学视觉Transformer (10):目标检测DETR-1
- Android自定义实现FlowLayout
- java swarm_java for swarm 学习笔记4
- JAVA中如何产生透明的VolatileImage
- 供SAPI中TTS功能用使的Win10语言包安装
- 基于javaweb,springboot银行管理系统
- ubuntu16.04下安装dnw和fastboot工具,解决开发板只有uboot系统,没有网络的情况下,通过dnw和fastboot传送文件到开发板
- 深信服AD应用交付管理维护
- 【类和对象】深入浅出类和对象
- 防止Form表单重复提交的客户端及服务器端的方式