中南大学数据结构课程设计排课问题表达式.docx
《中南大学数据结构课程设计排课问题表达式.docx》由会员分享,可在线阅读,更多相关《中南大学数据结构课程设计排课问题表达式.docx(60页珍藏版)》请在冰豆网上搜索。
中南大学数据结构课程设计排课问题表达式
中南大学
《数据结构》课程设计报告
学生姓名
学号
指导教师
学院
专业班级
完成时间
题目一:
利用线性表进行算式计算
一、实验名称:
利用线性表进行算式计算
二、需求分析:
设计任务:
界面上出现一个文本框,输入一个算式,点击按钮,显示结果。
该算式内只含有数字、括号、+、-、*、/、%这几种字符,优先级为:
括号--%--*,/--+,-。
如输入:
2+3*5,结果为17,输入(2+3)*5结果为25。
输入格式有误,需要给予提示。
在算法中,必须实现对输入的算式字符串的分析,而不仅仅是得到结果。
(1)输入的形式和输入值的范围:
数字和运算符(只含有括号、+、-、*、/、%)。
(2)输出的形式:
以数字和运算符组成的算式形式输出。
(3)程序所能达到的功能:
对输入数字和运算符进行分析,并输出分析结果。
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
三、概要设计
抽象数据类型的定义:
ADTStack{
数据对象:
D={ai|aiElemSet,i=1,2,…n,n0}
数据关系:
R1={|ai-1,aiD,i=1,2,…,n}
基本操作:
InitStack(&S);
//初始化栈S,构造一个空栈
StackEmpty(S);
//初始条件:
栈S已存在
操作结果:
若栈为空栈,则返回true,否则返回false
StackLength(S);
//初始条件:
栈S已存在
操作结果:
返回S的元素个数,即栈的长度
GetTop(S,&e)
//初始条件:
栈S已存在且非空
操作结果:
用e返回S的栈顶元素
Push(&S,e)
//初始条件:
栈S已存在
操作结果:
插入元素e为新的栈顶元素
Pop(&S,&e)
//初始条件:
栈S已存在且非空
操作结果:
删除S的栈顶元素,并用e返回其值
主程序的流程:
定义链栈,判断运算符优先级,实现具体计算,错误处理。
四、详细设计
主要算法:
(伪代码)
#defineN50
#defineOK1
#defineERROR0
#include
#include
typedefstruct{
inttop;
doublearray[N];
}NumStack;
typedefstruct{
inttop;
chararray[N];
}OpStack;
//把字符转换为相应的整数的函数
intCint(charmychar){
return(mychar-48);
}
//数字进栈的函数
statusPushNum(NumStack&numstack,doublenum){
if(numstack.top
{numstack.top++;
numstack.array[numstack.top-1]=num;
returnOK;
}
elsereturnERROR;
}
//数字出栈的函数
statusPopNum(NumStack&numstack,double&num){
if(numstack.top>0){
num=numstack.array[numstack.top-1];
numstack.top--;
returnOK;
}
elsereturnERROR;
}
//操作符进栈的函数
statusPushOp(OpStack&opstack,char&op){
if(opstack.top
opstack.top++;
opstack.array[opstack.top-1]=op;
returnOK;
}
elsereturnERROR;
}
//操作符出栈的函数
statusPopOp(OpStack&opstack,char&op){
if(opstack.top>0){
op=opstack.array[opstack.top-1];
opstack.top--;
returnOK;
}
elsereturnERROR;
}
//进行运算的函数
doubleCalc(doublea,doubleb,charc){
doubleresult;
五、调试分析
1.调试过程中遇到的问题是如何解决的以及对设计与实现的讨论和分析
调试过程中,对于非法输入的测试很重要,对于一些不符合常规的输入进行测试,并针对存在的问题对源代码进行修改,可以对于非法输入进行提示。
2.算法的时间复杂性和可能的改进设想
此算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n个数据组成,则此算法的时间复杂度为O(n)。
在转换算法中,中缀算术表达式中的每个字符均需要扫描一遍,对于扫描到的每个运算符,最多需要进行入栈、出栈和写入后缀表达式这三次操作,对于扫描到的数字或小数点,只需要把它直接写入到后缀表达式即可。
所以,此算法的时间复杂度为O(n),n为后缀表达式中字符的个数。
六、测试结果
1、输入:
5+6*3%2
输出:
5+6*3%2=11.0
2、输入:
3+5*(8-2)%4
输出:
3+5*(8-2)%4=13.0
3、输入:
1*5++2
输出:
对不起!
表达式有错!
4、输入:
123321123+456654456
输出:
123321123+456654456=5.7997555E8
5、输入:
1111
输出:
1111=1111.0
6、输入:
5(3+2)
输出:
对不起!
表达式有错!
7、输入:
5+9*3-8/4%2
输出:
5+9*3-8/4%2=-Infinity
界面效果图
运行结果显示-1
运行结果显示-2
七、课程设计总结
通过本次数据结构课程设计,我有很多收获,在此,我将我的亲身感受回顾和总结于下:
在上学期中学习了本专业的核心课程——数据结构。
什么是数据结构呢?
这是我们首先考虑到的问题:
从字面上来看,“数据结构”分数据和结构两部分,这就很容易联想到数据结构的本质是一种使数据结构化的知识。
通过理论课程的学习,使我初步了解了数据结构的基本知识。
数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科。
现代程序设计已转型为讨论如何在最大程度上处理好数据之间的相互关系并提升数据处理的效率。
在这里,数据结构就发挥了重要的作用。
数据结构可以说是编程的灵魂,它不是一门语言。
数据结构和程序设计语言本身没有任何联系,唯一有的关系就是用程序语言去描述数据结构。
现今我们所学习的数据结构课程常用的描述语言主要有C、C++和JAVA等。
数据结构只是给我们提供处理常规问题的一个思路而已,讲的是已经成熟的编程思想和算法,适用于所有开发语言。
所以说,组织好数据结构是写程序的第一步。
数据结构是一门实践性较强的计算机基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
课程设计的目的就是要达到理论与实际应用相结合,使我们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,同时强化对编程语言的使用,培养基本的、良好的程序设计能力。
我于大二上学期从软件学院软件工程专业转到信息学院计算机专业,在09年暑假中,我参加了软件学院的JAVA实训,了解了一定的JAVA语言知识,因为本次课程设计要制作界面,所以选择JAVA语言有它的优势。
通过这次课程设计,我体会到要做出一个好的程序是很难的,尽管我花了一个多星期去做这两个项目,但这个程序还是不够理想,只是达到一些基本的水平而已,跟那些功能强大的程序还是有很大的距离。
这个程序还有一些地方值得完善的,比如算式计算中一些非法输入(如数字后面连续输入括号无法判断非法并影响计算结果等),这些问题需要程序员考虑得更全面,使实现的功能更完善,在今后不断改进。
在近两周的课程设计中,我认为最大的收获就是在遇到问题时解决问题的过程。
如对语言并不完全了解,如有些函数的操作需要通过查阅相关书籍和帮助来了解,另外,在入栈、出栈的算法设计中,曾因为思路不清晰而在编代码时遇到了困难,对于运算符和数字的分离和判断也曾困扰过我。
我通过查阅书籍、上网搜索和向其他同学询问,才得以最终完成项目。
通过这次课程设计,我学到了很多,同时也认识到了自己的不足。
学校的课程不能将所有的知识都讲授给我们,所以要想学好一门课程,我们应该充分利用课余时间多看专业相关的书籍,丰富自己的知识。
同时,作为计算机专业的学生,动手能力也是非常重要的,在掌握了理论知识后应多多上机实践。
只有多多实践,才能更好地学习好一门语言,更好地理解课程的内容。
八、参考文献
【1】清华大学计算机系列教材·数据结构(C语言版)/严蔚敏,吴伟民编著
北京:
清华大学出版社,2007.4
【2】JavaJDK5.0学习笔记/良葛格编著·北京:
清华大学出版社,2006.8
九、附录
packagestack;
publicclassCharStack{
CharNodetop;
intsum;
publicCharStack()
{
top=newCharNode();
top.c='#';
sum=0;
}
publiccharpop()//不作有没有元素的判断,统一在出栈前进行判断,若没有元素,则不调用此函数
{
charc=top.node.c;
top.node=top.node.node;
sum--;
returnc;
}
publicvoidpush(charc)
{
CharNodenewNode=newCharNode();
newNode.c=c;
newNode.node=top.node;
top.node=newNode;
sum++;
}
}
classCharNode
{
CharNodenode;
charc;
publicCharNode()
{
node=null;
c='';
}
}
packagestack;
publicclassCharStack{
CharNodetop;
intsum;
publicCharStack()
{
top=newCharNode();
top.c='#';
sum=0;
}
publiccharpop()//不作有没有元素的判断,统一在出栈前进行判断,若没有元素,则不调用此函数
{
charc=top.node.c;
top.node=top.node.node;
sum--;
returnc;
}
publicvoidpush(charc)
{
CharNodenewNode=newCharNode();
newNode.c=c;
newNode.node=top.node;
top.node=newNode;
sum++;
}
}
classCharNode
{
CharNodenode;
charc;
publicCharNode()
{
node=null;
c='';
}
}
packagestack;
importjava.awt.GridBagConstraints;
importjava.awt.Insets;
/**
*����GBC��ʵ������ij�������GridBagLayout���ֹ���������ϵ��������
*λ�á���С���������Ե�����
*@authoribm
*
*/
publicclassGBCextendsGridBagConstraints{
/**
*���������ʼλ��(λ����������)
*@paramx
*@paramy
*/
publicGBC(intx,inty){
this.gridx=x;
this.gridy=y;
}
publicGBC(intgridx,intgridy,intgridwidth,intgridheight){
this.gridx=gridx;
this.gridy=gridy;
this.gridwidth=gridwidth;
this.gridheight=gridheight;
}
publicGBCsetAnchor(intanchor){
this.anchor=anchor;
returnthis;
}
/**
*�����������ʾ������������Сʱ�������С��������仯���
*@paramfill
*@return
*/
publicGBCsetFill(intfill){
this.fill=fill;
returnthis;
}
/**
*��������Ŀ�Ⱥ߶�
*@paramweightx
*@paramweighy
*@return
*/
publicGBCsetWeight(doubleweightx,doubleweighty){
this.weightx=weightx;
this.weighty=weighty;
returnthis;
}
/**
*�������ǰ��������֮��ļ���С
*@paramdistance
*@return
*/
publicGBCsetInset(intdistance){
this.insets=newInsets(distance,distance,distance,distance);
returnthis;
}
/**
*�������ǰ��������֮��ļ���С
*@paramdistance
*@return
*/
publicGBCsetInset(inttop,intleft,intbottom,intright){
this.insets=newInsets(top,left,bottom,right);
returnthis;
}
publicGBCsetIpad(intipadx,intipady){
this.ipadx=ipadx;
this.ipady=ipady;
returnthis;
}
}
publicclassGetPriority{
publicintinSideStack(charc)
{inti=0;
switch(c)
{case'=':
i=1;break;
case')':
i=1;break;
case'+':
i=3;break;
case'-':
i=3;break;
case'*':
i=5;break;
case'/':
i=5;break;
case'%':
i=7;break;
case'^':
i=9;break;
case'(':
i=1;break;
}
returni;
}
publicintoutSideStack(charc)
{inti=0;
switch(c)
{
case'=':
i=0;break;
case')':
i=0;break;
case'+':
i=2;break;
case'-':
i=2;break;
case'*':
i=4;break;
case'/':
i=4;break;
case'%':
i=6;break;
case'^':
i=8;break;
case'(':
i=10;break;
default:
i=-1;//当遇到不可识别的运算符识,设其优先级为-1,以便在主程序中能及时检查出错误
}
returni;
}
}
packagestack;
importjava.awt.BorderLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.*;
publicclassMainClassextendsJFrame{
privatestaticfinallongserialVersionUID=8669406311759888678L;
MainClassmainClass;
JTabbedPanetab;
JTextFieldinput,output;
JButtonbtnWork;
privateJTextAreatxtaDisplay;
privateJTextAreatxtaInput;
privateJLabellblDisplay;
privateJLabellblInput;
privateJButtonbtnProcess;
privateJPanelpnlNorth;
privateJPanelpnlSouth;
privateJPanelpnl;
privateJScrollPanescrDisplayPnl;
privateJScrollPanescrInputPnl;
publicstaticvoidmain(String[]args){
newMainClass().init();
}
publicvoidinit(){
try{
UIManager.setLookAndFeel("com.nilo.plaf.nimrod.NimRODLookAndFeel");
}catch(Exceptione){
try{
UIManager.setLookAndFeel(UIManager
.getSystemLookAndFeelClassName());
}catch(Exceptione1){
}
}
mainClass=newMainClass();
this.setTitle("数据结构");
this.setSize(500,400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.add(this.getJTabbedPane(),BorderLayout.CENTER);
this.setVisible(true);
}
publicJTabbedPanegetJTabbedPane(){
tab=newJTabbedPane();
tab.addTab("线性表",getFirstPanel());
tab.addTab("Huffman",newJPanel());
returntab;
}
publicJPanelgetFirstPanel(){
JPanelpanel=newJPanel();
panel.setLayout(newBorderLayout());
txtaDisplay=newJTextArea(8,10);
txtaDisplay.setEditable(false);
txtaInput=newJTextArea(8,15);
scrDisplayPnl=newJScrollPane(txtaDisplay);
scrInputPnl=newJScrollPane(txtaInput);
lblDisplay=newJLabel("分析结果");
lblInput=newJLabel("输入表达式:
");
btnProcess=newJButton("分析");
pnlNorth=newJPanel();
pnlSouth=newJPanel();
pnl=newJPanel();
pnlNorth.setLayout(newBorderLayout());
pnlSouth.setLayout(newBorderLayout());
//组件控制
pnlNorth.add(lblDisplay,BorderLayout.NORTH);
pnlNorth.add(scrDisplayPnl,BorderLayout.CENTER);
pnlSouth.add(lblInput,BorderLayout.NORTH);
pnlSouth.add(scrInputPnl,BorderLayout.CENTER);
pnl.add(btnProcess);
panel.add(pnlNorth,BorderLayout.NORTH);
panel.add(pnlSouth,BorderLayout.CENTER);
panel.add(pnl,BorderLayout.SOUTH);
btnProcess.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Stringsource=txtaInput.getText().trim();
txtaInput.setText("");
txtaDisplay.setText(calculate(source));
}
});
returnpanel;
}
publicStringcalculate(StringinputStr){
Stringresult;
CharStackcharStack=newCharStack();
NumStacknumStack=newNumStack();
GetPrioritypriority=newGetPriorit