数据结构课程设计.docx
- 文档编号:12710755
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:19
- 大小:74.16KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
惠州学院
计算机科学系
《数据结构课程设计》报告
课题名称:
算术表达式求值
专业:
网络工程
班级:
2班
学号:
1214080613213
姓名:
李文森
指导教师:
徐涛
目录
1.问题描述-----------------------------------------------------------3
2.基本要求-----------------------------------------------------------3
3.工具/准备工作----------------------------------------------------3
4.分析与实现--------------------------------------------------------4
5.课程设计体会与感悟------------------------------------------16
1.问题描述
从键盘上输入中缀算术表达式,包括括号,计算出表达式的值。
2.基本要求
(1)程序能对所输入的表达式做简单的判断,如表达式有错,能给适当提示。
(2)能处理单目运算符:
+,-。
3.工具/准备工作
在开始项目之前,应回顾复习相关内容。
需要一台计算机装有visualC++。
4.分析与实现
对于中缀表达式,一般运算规则如下:
(1)先乘方,再乘除,最后加减;
(2)同级运算从左算到右;
(3)先括号内再括号外;
(4)用到的头文件”utility.h”,”lk_stack.h”,”node.h”,”calculator.h”.
根据实践经验,可以对运算符设置统一的优先级,从而方便比较。
表中给出了包括加、减、乘、除、求余、左括号、右括号和分界符的优先级。
运算符
‘=’
‘(’、‘)’
‘+’、‘—’
‘*’、‘/’‘%’
‘^’
优先级
1
2
2
4
5
上面讨论的的+、—为双目运算符,如为单目运算符,编程实现时,可在前面加上0而转化为双目运算符。
如在+、—的前一个字符(如当前字符不是运算符时,规定用0表示)为‘=’或‘(’,则为单目运算符。
具体实现算法时,可设置两个工作栈,一个为操作栈,一个为操作符栈optr,另外一个为操作数栈opnd,算法基本思路如下:
(1)将optr栈和opnd栈清空,在optr栈中加入一个‘=‘。
(2)从输入流获取一字符ch,循环执行步骤(3)至步骤(5)直到求出表达式的值为止。
(3)取出optr的栈顶optrTop,当optrTop=‘=‘且ch=’=‘时,整个表达式求值完毕,这时opnd栈的栈顶元素为表达式的值。
(4)若ch不是操作符,则字符放回输入流(cin.putback),读操作数operand;将operand加入opnd栈,读入下一个字符ch。
(5)如ch是操作符,按如下方式进行处理:
a.如果ch为单目运算符,则在ch前面加上操作数0,也就是将0入opnd栈;
b.如果optrTop与ch不匹配,例如optrTop=‘)‘且ch=’(‘,显示错误信息;
c.如果optrTop=‘(‘且ch=’)‘,则从optr退出栈顶的’(‘,去括号,然后从输入流中读入字符并送入ch;
d.如果ch=’(’活optrTop比ch的优先级低,则ch入optr栈,从输入中取下一字符ch;
e.如果optrTop大于或等于ch的优先级,则从opnd栈退出left和right,从optr栈退出theta,形成运算指令(left)theta(right),结果如opnd栈。
对于界面处理:
(1)用文件流建立一个小小的界面,美化处理一些操作,文件名为dd.txt
//dd.txt文档内容
*
**
**
**
**
*******
**
*欢迎进入运算界面*
**
************
**
**
*请选择:
*
**
*1.开始运算*
*2.退出界面*
**
**
对于运算处理:
(1)通过运用栈和队列的特性,实现各种功能。
本类通过一系列的扩展实现各种出现的运算情况处理
//calculator.h
#ifndefCALCULATOR_H
#defineCALCULATOR_H
#include"lk_stack.h"
template
classCalculator
{
private:
LinkStack
LinkStack
charGetChar()//从输入流中跳过空格,换行符及制表符获取一字符
{
charc;
cin>>c;
returnc;
}
intOperPrior(charop);//要自己写的函数
voidGet2Operands(ElemType&left,ElemType&right);//要自己写的函数
ElemTypeOperate(ElemTypeleft,charop,ElemTyperight);//要自己写的函数
boolIsOperator(charch);//要自己写的函数
public:
Calculator(){};
virtual~Calculator(){};
voidRun();
};
//使用switch语句
template
intCalculator
:
OperPrior(charop)
{
switch(op)
{
case'=':
return1;
case'(':
return2;
case')':
return2;
case'+':
return3;
case'-':
return3;
case'*':
return4;
case'/':
return4;
case'%':
return4;
case'^':
return5;
}
}
//调用2次出栈函数,一定要先出右数,再出左数!
template
voidCalculator
:
Get2Operands(ElemType&left,ElemType&right)
{
opnd.Pop(right);
opnd.Pop(left);
}
//采用switch语句
template
ElemTypeCalculator
:
Operate(ElemTypeleft,charop,ElemTyperight)
{
switch(op)
{
case'+':
returnleft+right;
case'-':
returnleft-right;
case'*':
returnleft*right;
case'/':
returnleft/right;
case'%':
returnint(left)%int(right);//输入数为浮点数,要强制转换为整数!
case'^':
returnpow(left,right);
}
}
template
boolCalculator
:
IsOperator(charch)
{
if(ch=='='||ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='^')
returntrue;
else
returnfalse;
}
template
voidCalculator
:
Run()
{
optr.Clear();//清空optr栈
opnd.Clear();//清空opnd栈
optr.Push('=');
charch;
charpriorChar;//当前输入的前一个字符,如果不为操作符,则令其值为0
charoptrTop;
ElemTypeoperand;
charop;
priorChar='=';
ch=GetChar();
if(!
optr.Top(optrTop))throw"表达式有错!
";
while(optrTop!
='='||ch!
='=')
{
if(isdigit(ch)||ch=='.')
{
cin.putback(ch);
cin>>operand;
opnd.Push(operand);
priorChar='0';
ch=GetChar();
}
elseif(!
IsOperator(ch))
{
throw"表达式有错!
";
}
else
{
if((priorChar=='='||priorChar=='(')&&(ch=='+'||ch=='-'))
{
opnd.Push(0);
priorChar='0';
}
if(optrTop==')'&&ch=='('||optrTop=='('&&ch=='='||optrTop=='='&&ch==')')
throw"表达式有错!
";
elseif(optrTop=='('&&ch==')')
{
if(!
optr.Pop(optrTop))throw"表达式有错!
";
ch=GetChar();
priorChar=')';
}
elseif(ch=='('||OperPrior(optrTop) { optr.Push(ch); priorChar=ch; ch=GetChar(); } else { if(! optr.Pop(op))throw"表达式有错! "; ElemTypeleft,right; Get2Operands(left,right); opnd.Push(Operate(left,op,right)); } } if(! optr.Top(optrTop))throw"表达式有错! "; } if(! opnd.Top(operand))throw"表达式有错! "; cout<<""; cout<<"运算结果为: "; cout< } #endif 主函数功能: (1)应用dd.txt建立小小界面; (2)针对各种出错情况进行智能处理; (3)实现本次计算基本呢操作 //main主函数 #include"utility.h" #include"calculator.h" intmain() { //第一部分进行界面处理,通过文件流的方式 chara[100]; ifstreamin("dd.txt"); for(inti=1;i<19;i++) { in.getline(a,100);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计