计科0904李少朋数据结构课程设计报告.docx

上传人:b****8 文档编号:23816559 上传时间:2023-05-21 格式:DOCX 页数:23 大小:148.89KB
下载 相关 举报
计科0904李少朋数据结构课程设计报告.docx_第1页
第1页 / 共23页
计科0904李少朋数据结构课程设计报告.docx_第2页
第2页 / 共23页
计科0904李少朋数据结构课程设计报告.docx_第3页
第3页 / 共23页
计科0904李少朋数据结构课程设计报告.docx_第4页
第4页 / 共23页
计科0904李少朋数据结构课程设计报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

计科0904李少朋数据结构课程设计报告.docx

《计科0904李少朋数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《计科0904李少朋数据结构课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。

计科0904李少朋数据结构课程设计报告.docx

计科0904李少朋数据结构课程设计报告

 

山东理工大学计算机学院

课程设计

(数据结构)

 

班级

计科0904

姓名

李少朋

学号

0911051142

指导教师

张艳华

 

二○一一年一月二十日

课程设计任务书及成绩评定

课题名称

魔王语言

Ⅰ、题目的目的和要求:

1、设计目的

巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。

(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。

(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。

2、设计题目要求:

【问题描述】

有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是有以下两种形式的规则由人的语言逐步抽象上去的:

(1)α->β1β2…βm

(2)(θδ1δ2…δn)->θδnθδn-1…θδ1θ

在这两种形式中,从左到右均表示解释。

试写一个魔王语言的解释系统,把他的话解释成人能听懂的话。

【基本要求】

用下述两条具体规则和上述规则形式

(2)实现。

设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。

魔王语言可含人的词汇。

(1)B->tAdA

(2)A->sae

【测试数据】

B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae

若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:

“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。

 

T

D

s

a

e

z

g

x

n

h

一只

【实现提示】

将魔王语言自右至左进栈,总是处理栈顶字符。

若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。

其他情形较简单,请读者思考应如何处理。

首先实现栈和队列的基本操作。

【选作内容】

(1)由于问题的特殊性,可以实现栈和队列的顺序存储空间共享。

(2)代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规则,而不是把规则固定在程序中(第二种形式的规则只能固定在程序中)。

Ⅱ、设计进度及完成情况

日期

内容

1.10-1.11

选取参考书,查阅有关文献资料,完成资料搜集和系统分析工作。

1.12~1.14

创建相关数据结构,录入源程序。

1.17~1.19

调试程序并记录调试中的问题,初步完成课程设计报告。

1.20~1.21

上交课程设计报告打印版并进行课程设计答辩,要求每个同学针对自己的设计回答指导教师3-4个问题。

考核结束后将课程设计报告和源程序的电子版交班长统一刻光盘上交。

Ⅲ、主要参考文献及资料

[1]严蔚敏数据结构(C语言版)清华大学出版社1999

[2]严蔚敏数据结构题集(C语言版)清华大学出版社1999

[3]谭浩强C语言程序设计清华大学出版社

[4]与所用编程环境相配套的C语言或C++相关的资料

Ⅳ、成绩评定:

 

设计成绩:

(教师填写)

指导老师:

(签字)

 

二○一一年一月二十一日

目录

第一章概述……………………………………………………………

第二章系统分析………………………………………………………

第三章概要设计………………………………………………………

第四章详细设计………………………………………………………

第五章运行与测试……………………………………………………

第六章总结与心得……………………………………………………

参考文献………………………………………………………………

第一章概述

课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。

课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。

《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次课程设计中我选择的题目是魔王语言。

这个题目类似于密码解锁,先是通过对魔王语言进行去括号的操作,然后再将魔王自己的语言被特定的字符替代,翻译成人的语言。

通过对魔王语言的多次翻译之后,翻译成人能懂得语言。

 

第二章系统分析

1.魔王语言的流程图

2.使用到了栈和队列的一些基本操作。

typedefstructnode//栈的存储结构

{

chardata;

structnode*next;

}LinkStackNode,*LinkStack;

typedefstructNode//队列的存储结构

{

chardata;

structNode*next;

}LinkQueueNode;

typedefstruct

{

LinkQueueNode*front;

LinkQueueNode*rear;

}LinkQueue;

3.在主程序中使用到了字符数组的一些操作。

4.将魔王语言中的括号去除,将大写字母转换成小写字母,再翻译。

5.测试。

 

第三章概要设计

功能模块层次结构图:

 

 

数据结构的名称及描述:

(1)栈:

ADTStack{

数据对象:

D={a[i]|a[i]∈Elemset,i=1,2,…,n,n>=0}

数据关系:

R1={|a[i-1],a[i]∈D,i=2,…,n}

约定a[n]端为栈顶,a[1]端为栈底。

基本操作:

Initstack(&s)

操作结果:

构造一个空栈s。

Destroystack(&s)

初始条件:

栈s已存在。

操作结果:

栈s被取消。

Clearstack(&s)

初始条件:

栈s已存在。

操作结果:

将s清为空栈。

Stackempty(s)

初始条件:

栈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返回其值。

Stacktraverse(s,visit())

初始条件:

栈s已存在且非空

操作结果:

从栈底到栈顶依次对s的每个数据元素调用函数visit()。

一旦visit()失败,则操作失败。

}ADTstack

typedefstructnode//栈的存储结构

{

chardata;

structnode*next;

}LinkStackNode,*LinkStack;

(2)队列:

ADTqueue{

数据对象:

D={a[i]|a[i]∈Elemset,i=1,2,…,n,n>=0}

数据关系:

R1={|a[i-1],a[i]∈D,i=2,…,n}

约定其中a[1]端为队列头,a[n]端为队列尾。

基本操作:

Initqueue(&q)

操作结果:

构造一个空队列q。

Destroyqueue(&q)

初始条件:

队列q已存在。

操作结果:

队列q被销毁,不再存在。

Clearqueue(&q)

初始条件:

队列q已存在。

操作结果:

将q清空为空队列。

Queueempty(q)

初始条件:

队列q已存在。

操作结果:

若队列q为空队列,则返回TRUE,否则FALSE。

Queuelength(q)

初始条件:

队列q已存在。

操作结果:

返回q的元素个数,即队列的长度。

Gethead(q,&e)

初始条件:

q为非空队列。

操作结果:

用e返回q的队头元素。

Enqueue(&q,e)

初始条件:

队列q已存在。

插入元素e作为q的队尾元素。

Dequeue(&q,&e)

初始条件:

q为非空队列。

操作结果:

删除q的队头元素,并用e返回其值。

Queuetraverse(q,visit())

初始条件:

队列q已存在且非空。

操作结果:

从队头到队尾,依次对q的每个数据元素调用函数visit()。

一旦visit()失败,则操作失败。

}ADTQueue

typedefstructNode//队列的存储结构

{

chardata;

structNode*next;

}LinkQueueNode;

typedefstruct

{

LinkQueueNode*front;

LinkQueueNode*rear;

}LinkQueue;

第四章详细设计

魔王语言源代码:

#include

#include

#include

#include

#defineL_size100

usingnamespacestd;

//栈的操作//////

typedefstructnode

{

chardata;

structnode*next;

}LinkStackNode,*LinkStack;

voidInitStack(LinkStack*top)

{

(*top)=(LinkStack)malloc(sizeof(LinkStackNode));

(*top)->next=NULL;

}

voidPush(LinkStacktop,chara)

{

LinkStackNode*temp;

temp=(LinkStackNode*)malloc(sizeof(LinkStackNode));

temp->data=a;

temp->next=top->next;

top->next=temp;

}

voidPop(LinkStacktop,char*x)

{

LinkStackNode*temp;

temp=top->next;

top->next=temp->next;

*x=temp->data;

free(temp);

}

////队列的操作////

typedefstructNode

{

chardata;

structNode*next;

}LinkQueueNode;

typedefstruct

{

LinkQueueNode*front;

LinkQueueNode*rear;

}LinkQueue;

voidInitQueue(LinkQueue*Q)

{

Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));

if(Q->front!

=NULL)

{

Q->rear=Q->front;

Q->front->next=NULL;

}

}

voidEnterQueue(LinkQueue*Q,charx)

{

LinkQueueNode*NewNode;

NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));

if(NewNode!

=NULL)

{

NewNode->data=x;

NewNode->next=NULL;

Q->rear->next=NewNode;

Q->rear=NewNode;

}

}

voidDeleteQueue(LinkQueue*Q,char*x)

{

LinkQueueNode*p;

p=Q->front->next;

Q->front->next=p->next;

if(Q->rear==p)

Q->rear=Q->front;

*x=p->data;

free(p);

}

//去括号

//思想:

当没遇到闭括号时,一直压栈(top栈)。

一旦遇到闭括号,首先找到与这个闭括号最近的匹配的开括号

//找到这两个括号"("")"之间的第一个字符

//利用队列(Q入队)以及(top栈出栈)完成转换,再把转换后的队列,添加到(top栈中)把剩余的字符原样添加到top栈中

//在把top栈逆置到top1栈中

//再利用top1栈出栈,给L重新赋值。

//递归,看L中是否还有括号

voidquk(LinkStackNode*top,LinkStackNode*top1,LinkQueue*Q,charL[])

{

inti=0,j;

char*a;

charfirst;

a=(char*)malloc(sizeof(char));

InitStack(&top);

InitQueue(Q);//辅助用来输出括号内的内容

InitStack(&top1);

while(L[i]!

=')')

{

Push(top,L[i]);//当不等于')'时,往top栈中压。

i++;

}

if(L[i]==')')//当等于')'时

{

j=i;

while(L[j]!

='(')

{j--;

if(L[j]=='(')

{

j++;break;

}

}

first=L[j];//找到当前'('内的第一个字符

for(;j

{

EnterQueue(Q,first);

Pop(top,a);

EnterQueue(Q,*a);

}

Pop(top,a);//这个是括号内的第一个字符

EnterQueue(Q,*a);

Pop(top,a);//把'('删掉

while(Q->front->next!

=NULL)

{

DeleteQueue(Q,a);

Push(top,*a);

}

}//if

i++;//跳过')'

while(L[i]!

=NULL)

{Push(top,L[i]);

i++;

}

while(top->next!

=NULL)

{

Pop(top,a);

Push(top1,*a);

}

i=0;

while(top1->next!

=NULL)

{

Pop(top1,a);

L[i]=*a;

i++;

}

L[i]=NULL;

i=0;j=0;

while(L[i]!

=NULL)

{

i++;

if(L[i]=='('||L[i]==')')

j++;

}

if(j==0)

return;

elsequk(top,top1,Q,L);

}

//////主函数//////////////

voidmain()

{

printf("*********************************************\n");

printf("**\n");

printf("*魔王语言解释系统*\n");

printf("**\n");

printf("*********************************************\n");

printf("*班级计科0904*\n");

printf("**\n");

printf("*姓名:

李少朋学号:

0911051142*\n");

printf("*********************************************\n");

intm,n,i,j,t,k,p,w=0,h;

chars[30],z[30][10],d[30],x[30][20],L[L_size];//魔王说的话

printf("请输入魔王语言(不能有空括号):

\n");

scanf("%s",L);

LinkStackNode*top,*top1;

top=(LinkStackNode*)malloc(sizeof(LinkStackNode));

top1=(LinkStackNode*)malloc(sizeof(LinkStackNode));

LinkQueue*Q;

Q=(LinkQueue*)malloc(sizeof(LinkQueue));

cout<<"您可能用到的字母有(不能有重复的字母):

"<

cin>>s;

cout<<"字母释义:

"<

for(i=0;i

{

cout<

";

cin>>z[i];

}

cout<<"魔王语言是:

"<

printf("%s\n",L);

for(i=0;i

{

if(L[i]=='('||L[i]==')')

quk(top,top1,Q,L);

}

for(i=0;i

{

if((L[i]>='A')&&(L[i]<='Z'))

h=1;

}

if(h==1)

{cout<<"请输入您需要规定几条第一种规则"<

cout<<"需要输入的规则数是:

";cin>>n;

for(i=0;i

{

cout<<"第"<

"<

cout<<"请先输入一个大写字母:

";

cin>>d[i];

cout<<"(用后面的字符表示)-->";

cin>>x[i];

}

}

p=strlen(L);

i=0;//以下步骤while是大写字母全部转换成了小写

while(i

{

if((L[i]>='A')&&(L[i]<='Z'))

{

for(j=0;j

{

if(L[i]==d[j])

{

t=strlen(x[j]);

for(k=1;k<=p-1-i;k++)////后移

{

L[p+t-1-k]=L[p-k];

}

for(m=i;m<=i+t-1;m++)//填充移动后前面的空位

{

L[m]=x[j][w];w++;

}

w=0;

}

}

p=p+t-1;

}

else

i++;

}

cout<<"需要翻译的字符串为:

"<

for(i=0;i

cout<

cout<

cout<<"翻译的意思为:

"<

for(j=0;j

{i=0;

while(i

{

if(L[j]==s[i])

{

cout<

break;

}

else

i++;

}

}

cout<

}

 

第五章运行与测试

1.问题a:

当魔王语言中没有括号时,函数quk(),无法执行,函数暂停。

b:

当魔王语言中有空括号时,函数无法继续执行。

c:

魔王语言中只能有大写字母或小写字母。

2.测试数据及结果如下图。

 

 

第六章总结与心得

通过这次课程设计让我对《数据结构》这门课程更加感兴趣。

让我对栈和队列更加熟悉,对数组的运用也有所提高。

经过几天和同学进行的程序设计合作,使我明白了做一件事情如果靠团结的力量是很容易完成的。

再次感谢指导我们的老师,给了我们莫大的帮忙,使我们的工作事半功倍。

本次任务完成情况良好,能够完好的解决题目所给的要求,达到了程序设计的输入、输出、有穷性、可行性、确定性的程序要求。

 

参考文献:

[1]严蔚敏、吴伟民主编《数据结构》(C语言版)清华大学出版社2002

[2]殷人昆等著《数据结构》(C++版)清华大学出版社2001

[3]金远平著《数据结构》(C++描述)清华大学出版社2005

[4]许卓群等著《数据结构与算法》高等教育出版社2004

[5]FrankM.Carrano等著《数据结构与C++高级教程》清华大学出版社2004

[6]严蔚敏、吴伟民《数据结构习题集》(C语言版)清华大学出版社

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

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1