C、C++语言实现的数据结构课程设计的计算器(堆栈)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
// 我真诚地保证:
// 我自己独立地完成了整个程序从分析、设计到编码的所有工作。
// 如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中// 详细地列举我所遇到的问题,以及别人给我的提示。
// 我的程序里中凡是引用到其他程序或文档之处,
// 例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段,
// 我都已经在程序的注释里很清楚地注明了引用的出处。
// 我从未没抄袭过别人的程序,也没有盗用别人的程序,
// 不管是修改式的抄袭还是原封不动的抄袭。
// 我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转。
// <李雷阳>
*/
/********************************************************************
用堆栈做的计算器程序 *
创建者:李雷阳*
创建时间:2011.03.12 *
最后修改时间:2011.03.15 *
/********************************************************************
/********************************************************************
本程序功能:实现用堆栈处理计算表达式
具体内容:
I: 如果算式里面有计算式不应该出现的字符,则将其智能略去
如:将(1.4a54+2f.6)*3.09s+4ff看成(1.454+2.6)*3.09+4
II: 检查括号是否匹配,如果匹配,再检查是否出现在合法位置
如:(8*(7-4)不匹配,以及65*(72+98)(70-45)匹配但是不合法
III: 检查计算数与计算符号的数量是否合格
如:+23-4* 、23-4*、+23-4 等等
IV: 检查输入小数的时候小数点是否输入过多以及智能改正
如:将3....2*10+8 看成3.2*10+8
V: 检查连续输入大于两个符号时候是否能智能修改,“不能”
则-> 对于3+-2 给出判断结果:输入有误
VI: 接V:如果判断能够改正,则------------------------------->
将4++++++++++++5看成4+5并计算
VII:检测“0”是否出现在分母上
【下边是检测数据,检测结果与期望结果吻合】
【注:输入数据结尾没有“#”,以为在我的程序里面要它没用】
()*2+3# 期望结果:输入有误
(3+3)*3+1*(1+3)-3/2+3*3# 期望结果:29.5
1+2*(4-5)+45# 期望结果:44.000000
(1.454+2.6)*3.09+4# 期望结果:16.5269
(1.4a54+2f.6)*3.09s+4ff# 期望结果:16.5269
(56-23)/8-4# 期望结果:0.125
34+p(u89-12.3)k/3# 期望结果:59.5667
89.5*749+25)# 期望结果:输入有误
89.5*749+25# 期望结果:67060.500000
(8*(7-4)# 期望结果:输入有误
65*(72+98)(70-45) # 期望结果:输入有误
6*# 期望结果:输入有误
)5+3(# 期望结果:输入有误
(3+)(4)# 期望结果:输入有误
3....2*10+8# 期望结果:40
+23-4*# 期
望结果:输入有误
23-4*# 期望结果:输入有误
+23-4# 期望结果:输入有误
3+-2# 期望结果:输入有误
4+++++++++++++++5# 期望结果:9
********************************************************************/
/******************************************************************** * 程序中所用到的头文件 *
********************************************************************/
#include<iostream>
#include<cstring>
using namespace std;
/********************************************************************
* 宏定义*
********************************************************************/
#define MAX_LENGHT 50
//预先假设计算字符串最多有500个字符
#define MAX 10
//一般情况下输入要计算的数不会超过10位
/********************************************************************
* 自定义函数*
********************************************************************/
bool isOperand(char ch);
//检查是否为操作数
int priority( char op);
//设置操作等级并返回操作符op的等级
template <class Stack_type>
//用计算符号op计算数字number_1 和 number_2
Stack_type caculate( char op, const Stack_type number_1, const Stack_type number_2 );
char *mark(char string[]);
//将符号和数字放在同一个堆栈里面时,两个数字可能会连在一起,导致无法区分
//哪个是第一个数哪个是第二个数,这里我用了小方法,就是在每个数字后边加个
//字母a来将两个连着的数字区分开
char *parsing(char A_string[]);
//将将传入的中缀计算字符串A_string转化成后缀计算字符串并返回一个指针
float result(char A_string[]);
//计算用函数“char *parsing(char A_string[]);”转化过的后缀计算字符串的值