数据结构课程设计计算器Word格式文档下载.docx

上传人:b****5 文档编号:8404804 上传时间:2023-05-11 格式:DOCX 页数:22 大小:73.74KB
下载 相关 举报
数据结构课程设计计算器Word格式文档下载.docx_第1页
第1页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第2页
第2页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第3页
第3页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第4页
第4页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第5页
第5页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第6页
第6页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第7页
第7页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第8页
第8页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第9页
第9页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第10页
第10页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第11页
第11页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第12页
第12页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第13页
第13页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第14页
第14页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第15页
第15页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第16页
第16页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第17页
第17页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第18页
第18页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第19页
第19页 / 共22页
数据结构课程设计计算器Word格式文档下载.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构课程设计计算器Word格式文档下载.docx

《数据结构课程设计计算器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计计算器Word格式文档下载.docx(22页珍藏版)》请在冰点文库上搜索。

数据结构课程设计计算器Word格式文档下载.docx

主要算法描述如下:

A.将中缀表达式转换为后缀表达式:

1.将中缀表达式从头逐个字符扫描,在此过程中,遇到的字符有以下几种情况:

1)数字

2)小数点

3)合法操作符+-*/%

4)左括号

5)右括号

6)非法字符

2.首先为操作符初始化一个map<

std:

:

string,int>

priority,用于保存各个操作符的优先级,其中+-为0,*/%为1

3.对于输入的字符串from和输出的字符串to,采用以下过程:

初始化遍历器std:

string:

iteratorit=infix.begin()

在当it!

=from.end(),执行如下操作

4.遇到数字或小数点时将其加入到后缀表达式:

case'

1'

2'

3'

case'

4'

5'

6'

7'

8'

9'

0'

.'

{

to=to+*it;

break;

}

5.遇到操作符(+,-,*,/,%)时,如果此时栈顶操作符的优先级比此时的操作符优先级低,则将其入栈,否则将栈中的操作符从栈顶逐个加入到后缀表达式,直到栈空或者遇到左括号,并将此时的操作符加入到栈中,在此过程中需判断表达式中是否出现输入错误:

+'

-'

*'

/'

%'

if((it+1)==from.end())

{

cout<

<

"

输入错误:

运算符号右边缺少运算数"

endl;

returnfalse;

}

if((*it=='

||*it=='

)&

&

it==from.begin())

运算符号左边缺少运算数"

if((it+1)!

=from.end()&

(*(it+1)=='

||*(it+1)=='

))

运算符号连续出现"

to=to+"

"

;

if(sym.empty())

sym.push(*it);

break;

tem=sym.top();

while(pri[*it]<

=pri[tem]&

!

sym.empty()&

tem!

='

('

to=to+tem+"

sym.pop();

if(sym.empty())break;

tem=sym.top();

sym.push(*it);

}

6.遇到“(”时,直接将其加入操作符栈,并且检测输入错误,并且当括号后的第一个符号为-时,说明用户试图输入负号,这种情况我们向目标表达式输出一个0,以达到处理负号的目的:

表达式以左括号结尾"

//若以+或者-开头,则按照正负号看待,向目标表达式中加入一个0

if(*(it+1)=='

to=to+'

if((it+1)!

((*(it+1)=='

)'

)))

左括号右边不能为运算符号或右括号"

if(it!

=from.begin()&

(*(it-1)!

*(it-1)!

左括号左边不能为运算数或右括号"

5.遇到“)”时,将栈中的操作符从栈顶逐个弹出并放入后缀表达式中,直到在栈中遇到“(”,并将“(”从栈中弹出:

*(it+1)!

右括号右边不能为运算数"

(*(it-1)=='

||*(it-1)=='

右括号左边不能为运算符号"

{

cout<

表达式以右括号开始"

returnfalse;

}

tem=sym.top();

while(tem!

if(sym.empty())

括号匹配有误"

sym.pop();

B.计算后缀表达式的主要思想:

逐个字符的扫描后缀表达式,遇到单个数字或小数点时则先将其将其存到一个字符串中,当遇到后缀表达式中的分隔符(这里使用空格)时,则将这个字符串转化为数字放到堆栈numstack中;

numtemp+=*it;

case'

'

if(numtemp!

="

if(numtemp.find('

numtemp.find('

(numtemp.find('

)+1))!

=string:

npos)

小数点数目超出:

+numtemp<

strm.str(numtemp);

strm>

>

d;

numstack.push(d);

numtemp="

strm.str("

);

strm.clear();

2.遇到操作符+,-,*,/,%时,将堆栈numstack中的栈顶的两个数取出来,进行相应操作的运算,并将结果加入到堆栈numstack中;

d2=numstack.top();

numstack.pop();

d1=numstack.top();

numstack.push(d1+d2);

numstack.push(d1-d2);

numstack.push(d1*d2);

if(fabs(d2)<

0.0000001)

除数不能为0"

numstack.push(d1/d2);

if((fabs(d2-(int)d2))<

0.0000001&

(fabs(d1-(int)d1))<

intn1=(int)d1;

intn2=(int)d2;

numstack.push((double)(n1%n2));

else

cerr<

求模操作只能作用于整数"

}

3.直到后缀表达式扫描完并且堆栈numstack中只有一个数值,则此数值为计算的最终结果,否则说明输入有误。

分析与探讨:

1、测试结果分析:

测试结果见本篇开始的实际输入输出结果。

该计算器几乎实现了所有相关功能,包括简单计算、负数小数处理,容错,并且健壮性好,对于错误的表达式可以给出适当提示,不会导致程序崩溃。

2、算法分析

1、对于中缀表达式转换成后缀表达式:

时间复杂性为O(n)

2、对于后缀表达式的计算:

时间复杂性为O(n)

综上,该程序算法的时间复杂度为O(n)

3、算法改进

该程序存在的主要问题是命令行式的用户界面不够友好。

Windows下的用户图形界面需要MFC方面的知识,因为时间关系没有进行这方面的深入学习。

附录:

源代码

文件一.ExpressionHandler.h

#include<

string>

map>

stack>

iostream>

sstream>

usingnamespacestd;

classExpressionHandler{

public:

ExpressionHandler(stringexp){

this->

exp=exp;

}

boolinfixtoprofix(string&

exp);

booldoprofix(stringprofix,double&

result);

private:

stringexp;

};

文件二.ExpressionHandler.cpp

//CodedByCS_Zhanglin

#include"

ExpressionHandler.h"

boolExpressionHandler:

infixtoprofix(string&

exp){

stringfrom=this->

exp;

stringto="

stack<

char>

sym;

map<

char,int>

pri;

chartem;

pri['

]=1;

]=2;

string:

iteratorit=from.begin();

if(*it=='

)to+='

while(it!

=from.end()){

//cout<

1<

switch(*it)

{

default:

cout<

未知符号"

returnfalse;

++it;

if(!

sym.empty())

{

to=to+"

tem=sym.top();

while(!

if(tem=='

to=to+tem+"

sym.pop();

if(sym.empty())break;

exp=to;

returntrue;

}

doprofix(stringprofix,double&

result)

{

stringnumtemp;

double>

numstack;

stringstreamstrm;

doubled,d1,d2;

for(string:

iteratorit=profix.begin();

it!

=profix.end();

++it)

switch(*it)

case'

d2=numstack.top();

numstack.pop();

d1=numstack.top();

numstack.push(d1+d2);

numstack.push(d1-d2);

numstack.push(d1*d2);

numstac

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2