您的当前位置:首页八皇后数据结构课程设计

八皇后数据结构课程设计

2022-07-28 来源:爱问旅游网
目录

一. 二. 三.

3.1.

课程设计的目的 .................................................................................................................................. 0 功能说明 .............................................................................................................................................. 0 详细设计 .............................................................................................................................................. 1 功能模块设计 .................................................................................................................................. 1 3.1.1. 3.1.2. 3.1.3. 3.1.4. 3.2.

3.2.1. 3.2.2. 3.3. 四.

4.1.

4.2. 4.3. 4.4. 4.5.

结束语 ................................................................................................................................................................ 10 参考文献 .............................................................................................................................................................11

调试结果 .......................................................................................................................................... 8 调试时遇到的问题及解决 .............................................................................................................. 9 时间复杂度分析 .............................................................................................................................. 9 算法的改进设想 .............................................................................................................................. 9

主函数main()的执行流程 ............................................................................................... 1 创建模块 .............................................................................................................................. 1 操作模块 .............................................................................................................................. 2 显示模块 .............................................................................................................................. 2 定义全局变量 .................................................................................... 错误!未定义书签。 散列表类模板的定义 .......................................................................................................... 2

数据结构设计 .................................................................................................................................. 2

函数功能描述 .................................................................................................................................. 3 程序实现 .............................................................................................................................................. 3 源码分析 .......................................................................................................................................... 3

一. 课程设计的目的

1. 理解与掌握散栈与队列这两种重要的数据结构。 2. 站与队列的构造,多种操作。

3. 设计功能完整的栈,队列,魔王语言翻译程序。

二. 功能说明

整个实验完成一个完整的魔王语言翻译,本实验中涉及到栈与队列的构造,插入,删除等。整个程序由如下几大模块组成:

1. 创建模块。创建模块创建栈与队列。

2. 操作模块。操作模块处理对入栈,队列的操作。 3. 显示模块。显示出处理后的魔王语言翻译结果。

青岛滨海学院课程设计

图1 功能模块图 创建模块 操作模块 显示模块 魔王语言翻译实验创建栈与队列处理输入的语言显示翻译结果 三. 详细设计

3.1.

功能模块设计

3.1.1. 主函数main()的执行流程

程序中只需要输入魔王语言,将其翻译成人类语言。 1. 创建:命令C,创建栈与队列。 2. 输入魔王语言。 3. 处理魔王语言。

4. 退出:命令X,退出程序。 执行流程如图:

图2 主函数main()的流程图 处理语言,完成相应功能 结束 输入魔王语言 开始 调用main()函数 3.1.2. 创建模块

本模块创建栈与队列。

1

青岛滨海学院课程设计

3.1.3. 操作模块

1. 输入魔王语言。

2. 通过栈与队列的操作翻译魔王语言。

3.1.4. 显示模块

显示翻译结果。

3.2. 数据结构设计

3.2.1.

定义全局变量

#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define NULL 0 #define OVERFLOW -2 #define MAXSIZE 100 #define stack_init_size 100 #define stackincrement 10 typedef char selemType; typedef char qelemType; typedef char elemType; typedef int status; char e;

char demon[MAXSIZE];

3.2.2.

栈,队列结构的定义

typedef struct

{ selemType *base; selemType *top;

int stacksize;

}sqstack; typedef struct { queueptr front;

queueptr rear;

}linkqueue;

2

青岛滨海学院课程设计

3.3. 函数功能描述

1.status initstack (sqstack *s)

status initstack (sqstack *s) 为创建,初始化栈函数 。 2.status push (sqstack *s,selemType e)

status push (sqstack *s,selemType e) 为入栈函数。 3.status pop(sqstack *s,selemType *e) status pop(sqstack *s,selemType *e) 为出栈函数。 4.status initqueue(linkqueue *q)

status initqueue(linkqueue *q) 为创建队列函数。 5.status enqueue(linkqueue *q,qelemType e) status enqueue(linkqueue *q,qelemType e) 为入队函数。 6.status dequeue(linkqueue *q,qelemType *e)

status dequeue(linkqueue *q,qelemType *e) 为出队函数。

7.void tempstack(sqstack *temps)

void tempstack(sqstack *temps) 为临时栈函数。 8.void spenqueue(linkqueue *q,char key) void spenqueue(linkqueue *q,char key) 为特殊入队函数。 9.status sort(sqstack *s,linkqueue *q)

status sort(sqstack *s,linkqueue *q) 为排序入队处理函数。

四. 程序实现

4.1.

源码分析

#include #include #include #include

/*定义全局变量*/ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define NULL 0 #define OVERFLOW -2

3

青岛滨海学院课程设计 #define MAXSIZE 100 #define stack_init_size 100 #define stackincrement 10 typedef char selemType; typedef char qelemType; typedef char elemType; typedef int status; char e;

char demon[MAXSIZE];

/* 类型及其基本操作*/ typedef struct {

selemType *base; selemType *top; int stacksize;

}sqstack;

status initstack (sqstack *s) {

s->base=(selemType *)malloc(stack_init_size*sizeof(selemType)); if(!s->base) exit (OVERFLOW); s->top=s->base;

s->stacksize=stack_init_size; return OK;

}/*创建栈*/

status push (sqstack *s,selemType e) {

if(s->top-s->base>=s->stacksize) { }

*(s->top++)=e; return OK;

s->base=(elemType*) realloc(s->base,(s->stacksize+stackincrement)*sizeof(elemType)) ; if(!s->base) exit(OVERFLOW); s->top=s->base+s->stacksize; s->stacksize+=stackincrement;

}/*入栈*/

status pop(sqstack *s,selemType *e) {

if(s->top==s->base) return ERROR; *e=*(--(s->top)); return OK;

}/*出栈*/

/*队列类型及其基本操作*/

4

青岛滨海学院课程设计 typedef struct qnode {

qelemType data; struct qnode *next;

}qnode,*queueptr; typedef struct {

queueptr front; queueptr rear;

}linkqueue;

status initqueue(linkqueue *q) {

q->front=q->rear=(queueptr)malloc(sizeof(qnode)); if(!q->front) exit(OVERFLOW); q->front->next=NULL; return OK;

}/*创建队列*/

status enqueue(linkqueue *q,qelemType e) {

queueptr p;

p=(queueptr)malloc(sizeof(qnode)); if(!p) exit(OVERFLOW); p->data=e; p->next=NULL; q->rear->next=p; q->rear=p; return OK;

}/*入队*/

status dequeue(linkqueue *q,qelemType *e) {

queueptr p;

if(q->front==q->rear) return ERROR; p=q->front->next; *e=p->data;

q->front->next=p->next; if(q->rear==p) { } free(p); return OK;

q->rear=q->front;

}/*出队*/

/*括号内元素入栈处理函数*/ void tempstack(sqstack *temps)

5

青岛滨海学院课程设计 {

/*特殊入队函数*/

void spenqueue(linkqueue *q,char key) {

int j=0; char a[5];

switch(key) /*判断大写字母对应的字符串*/ {

case'A':strcpy(a,\"ase\");break; case'B':strcpy(a,\"tAdA\");break; case'C':strcpy(a,\"abc\");break; case'D':strcpy(a,\"def\");break; case'E':strcpy(a,\"ghi\");break; case'F':strcpy(a,\"klm\");break; case'H':strcpy(a,\"mop\");break;

default:strcpy(a,\"???\"); /*不能翻译的魔王语言以\"???\"输出*/ }

while(a[j]!='\\0') /*如果数组还有字母*/ {

6

int i=0; char t; char c; c=demon[i];

for(i=0;c!='#';i++)/*遍历数组*/ { }

c=demon[i];

if(c=='(')/*遇到开括号*/ { }

t=demon[i+1];/*取括号中的首字母*/ push(temps,t);/*入栈*/ i++;/*指向首字母*/ do {

i++; c=demon[i];

push(temps,c)/*第一次循环将次字母入栈*/; push(temps,t);/*再将首字母进栈*/

}while(c!=')');/*直到括号中元素全部进栈*/ pop(temps,&t);/*将多余进栈的首字母t出栈*/ pop(temps,&t); /*将多余进栈的')'出栈*/

}/*临时栈*/

青岛滨海学院课程设计

}

enqueue(q,a[j]);/*进队*/ j++;

}/*特殊入队*/ /*排序入队处理函数*/

status sort(sqstack *s,linkqueue *q) {

qnode b;

int flag=0;/*大写字母监视哨置零*/ int i;

for(i=0;demon[ i]!='#';i++)/*遍历数组*/ { }

return flag;

7

b.data=demon[ i];

if( ('a'<=b.data&&b.data<='z')||b.data=='?') /*如果是小写字母或者'?' 则直接进栈*/ { } else { }

if('A'<=b.data&&b.data<='Z') /*如果是大写字母,则调用特殊进栈函数,*/ { } else { }

if(b.data=='(')/*如果是括号*/ { }

do {

pop(s,&e); enqueue(q,e);

spenqueue(q,b.data);

flag=1; /*发现大写字母监视哨置1*/ enqueue(q,b.data);

}while(!(s->top==s->base)); /*只要栈不为空,则出栈进队*/

while (b.data!=')') /*只要还指向括号内元素,就继续往后移,保证原括号内的{ }

i++;

b.data=demon[i];

元素不再进栈*/

青岛滨海学院课程设计 }/*排序*/ /*主函数*/ status main() { }

sqstack s1; linkqueue q1; int k=0; int flag=1; //clrscr();

printf(\"Please Input the Demon's Words:\\n\"); printf(\"!: Less Than 30 Letters: )\\n\"); printf(\"!: End with '#': )\\n\\"); scanf(\"%s\

printf(\"\\n***************************************\"); initstack(&s1); /*创建栈*/ initqueue(&q1); /*创建队*/ tempstack(&s1); /*调用函数*/ while (flag==1) /*如果有大写字母*/ { }

demon[k]='\\0';

printf(\"\\n***************************************\"); printf(\"\\nThe Human Words:\\n\%s\printf(\"\\n***************************************\");

k=0;

flag=sort(&s1,&q1);

while(q1.front!=q1.rear) /*重写demon[i ]*/ { }

demon[k]='#';

dequeue(&q1,&e); demon[k]=e; k++;

4.2. 调试结果

使用VC++进行调试成功,程序的运行如下图:

8

青岛滨海学院课程设计

图3 程序调试运行图

4.3. 调试时遇到的问题及解决

在调试之中,主要遇到了以下问题:

1. 由于对C++的语言特性没有全面地掌握,在使用模板的过程中出现了许多语法错误。通过复习

C++语言知识解决。

2. 在对魔王语言翻译程序的编写过程中熟悉了栈,队列的应用。

4.4. 时间复杂度分析

栈,队列的操作时间复杂度O(n) 。

4.5. 算法的改进设想

魔王语言翻译是简单的通过栈与队列的插入,删除等操作进行对输入的魔王语言进行存储,翻译处理。但不能处理输入过多魔王语言的情况。本例中只能输入30个字符。现可通过矩阵存储的方法大大提高对魔王语言的存储,处理能力。矩阵可以利用压缩矩阵,矩阵的逆等进行操作。

9

青岛滨海学院课程设计

结束语

通过对魔王语言翻译的实验研究,对栈,队列有了更深层次的理解。尤其是通过对战与队列的创建,插入,删除等操作,熟悉了对栈与队列。通过查询资料,了解了魔王语言翻译的不同方法。在编写与调试程序的过程中,遇到了许多没有想到过的问题,通过一个个问题的解决,既熟悉了C++语言与调试技术,又熟悉了栈与队列的操作。在与他人合作的过程中,体会到了合作的重要性。本次课程设计使我有了很大的收获。

10

青岛滨海学院课程设计

参考文献

C语言实例解析(第二版) 人民邮电出版社

11

因篇幅问题不能全部显示,请点此查看更多更全内容