数据结构实验三栈和队列及其应用解析.docx

上传人:b****4 文档编号:27181889 上传时间:2023-06-27 格式:DOCX 页数:37 大小:114.24KB
下载 相关 举报
数据结构实验三栈和队列及其应用解析.docx_第1页
第1页 / 共37页
数据结构实验三栈和队列及其应用解析.docx_第2页
第2页 / 共37页
数据结构实验三栈和队列及其应用解析.docx_第3页
第3页 / 共37页
数据结构实验三栈和队列及其应用解析.docx_第4页
第4页 / 共37页
数据结构实验三栈和队列及其应用解析.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

数据结构实验三栈和队列及其应用解析.docx

《数据结构实验三栈和队列及其应用解析.docx》由会员分享,可在线阅读,更多相关《数据结构实验三栈和队列及其应用解析.docx(37页珍藏版)》请在冰豆网上搜索。

数据结构实验三栈和队列及其应用解析.docx

数据结构实验三栈和队列及其应用解析

实验编号:

3四川师大《数据结构》实验报告2016年10月29日

实验三栈和队列及其应用_

一.实验目的及要求

(1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们;

(2)本实验训练的要点是“栈”的观点及其典型用法;

(3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。

二.实验内容

(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);

(2)应用栈的基本操作,实现数制转换(任意进制);

(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);

(4)利用栈实现任一个表达式中的语法检查(括号的匹配)。

(5)利用栈实现表达式的求值。

注:

(1)~(3)必做,(4)~(5)选做。

三.主要仪器设备及软件

(1)PC机

(2)DevC++,VisualC++,VS2010等

四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)

(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);

A.顺序储存:

Ø代码部分:

//Main.cpp:

#include"SStack.h"

intmain()

{

SqStackS;

SElemTypee;

intelect=1;

InitStack(S);

cout<<"已经创建一个存放字符型的栈"<

while(elect)

{

Muse();

cin>>elect;

cout<

switch(elect)

{

case1:

cout<<"inputdata:

";

cin>>e;

Push(S,e);

break;

case2:

if(Pop(S,e))

{cout<

else{cout<<"blank"<

break;

case3:

if(StackEmpty(S))

{

cout<<"栈空"<

}

else

{

cout<<"栈未空"<

}

break;

case4:

GetTop(S,e);

cout<<"eis"<

break;

case5:

StackLength(S);

break;

case0:

break;

}

}

DestroyStack(S);

returnOK;

}

//SStack.cpp:

#include"SStack.h"

//输出菜单

voidMuse()

{

cout<<"请选择功能:

"<

cout<<"1.入栈"<

cout<<"2.出栈"<

cout<<"3.判栈空"<

cout<<"4.返回栈顶部数据"<

cout<<"5.栈长"<

cout<<"0.退出系统"<

cout<<"你的选择是:

";

}

//创建栈

StatusInitStack(SqStack&S)

{

S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!

S.base)exit(ERROR);

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

returnOK;

}

//得到顶部数据

StatusGetTop(SqStackS,SElemType&e)

{

if(S.base==S.top)returnERROR;

e=*(S.top-1);

returnOK;

}

//入栈

StatusPush(SqStack&S,SElemType&e)

{

if(S.top-S.base>=STACK_INIT_SIZE)

{

S.base=(SElemType*)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SElemType));

if(!

S.base)exit(ERROR);

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

returnOK;

}

//出栈

StatusPop(SqStack&S,SElemType&e)

{

if(S.base==S.top)

{

returnERROR;

}

e=*--S.top;

cout<<"popsucceed"<

returnOK;

}

//判栈空

StatusStackEmpty(SqStackS)

{

if(S.top==S.base)

{

returnERROR;

}

returnOK;

}

//销毁栈

StatusDestroyStack(SqStack&S)

{

free(S.base);

S.top=NULL;

S.stacksize=0;

cout<<"栈已销毁"<

returnOK;

}

intStackLength(SqStackS)

{

cout<<"StackLengthis"<

returnOK;

}

//SStack.h:

#include

#include

usingnamespacestd;

constintSTACK_INIT_SIZE=100;

constintSTACKINCREMENT=10;

constintERROR=0;

constintOK=1;

typedefcharSElemType;

typedefintStatus;

typedefstruct{

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack&S);//创建顺序存储的栈

StatusGetTop(SqStackS,SElemType&e);//得到栈顶数据

StatusPush(SqStack&S,SElemType&e);//入栈

StatusPop(SqStack&S,SElemType&e);//出栈

voidMuse();//输出菜单界面

StatusStackEmpty(SqStackS);//判断栈是否为空

StatusDestroyStack(SqStack&S);//销毁栈

intStackLength(SqStackS);//计算栈的长度

Ø运行结果:

B.链式储存:

Ø代码部分:

//Main.cpp

#include"Lstack.h"

intmain(){

Lq_StackL;

if(InintStack(L)){

cout<<"buildstacksucceed"<

}

elseexit(ERROR);

inte=0;

Menu(L,e);

DestroyStack(L);

return0;

}

//Lstack.cpp

#include"Lstack.h"

StatusInintStack(Lq_Stack&L){

//创建栈

L=(LqStack*)malloc(sizeof(LqStack));

if(!

L)exit(ERROR);

L->data=0;

L->next=NULL;

returnOK;

}

Statuspush(Lq_Stack&L,SElemTypee){

//入栈

LqStack*p;

p=(LqStack*)malloc(sizeof(LqStack));

if(!

p)exit(ERROR);

p->data=e;

L->data++;

p->next=L->next;

L->next=p;

returnOK;

}

Statuspop(Lq_Stack&L,SElemType&e){

//出栈

LqStack*p;

if(L->next==NULL)returnERROR;

p=L->next;

e=p->data;

L->next=p->next;

L->data--;

free(p);

returnOK;

}

StatusGetTop(Lq_StackL,SElemType&e){

//得到栈顶数据

if(L->next==NULL)returnERROR;

e=L->next->data;

returnOK;

}

StatusStackEmpty(Lq_StackL){

//判断栈是否为空

if(L->next==NULL){returnERROR;}

elsereturnOK;

}

intStackLength(Lq_StackL){

//计算栈的长度

returnL->data;

}

StatusDestroyStack(Lq_Stack&L){

//销毁栈

LqStack*p;

while(!

L)

{

L=p;

L=L->next;

free(p);

}

returnOK;

}

voidMenu(Lq_Stack&L,SElemTypee){

//输出菜单选择执行的功能

intselect=1;

while(select)

{

cout<<"————————————"<

cout<<"请选择功能"<

cout<<"——————1.入栈"<

cout<<"——————2.出栈"<

cout<<"——————3.得到顶部数据"<

cout<<"——————4.判断栈是否为空"<

cout<<"——————5.输出栈的长度"<

cout<<"——————0.退出程序"<

cout<<"你的选择是:

";

cin>>select;

switch(select){

case0:

break;

case1:

cout<<"pushdata:

";

cin>>e;

if(push(L,e)){

cout<<"pushsucceed"<

}

elsecout<<"pushfailed"<

break;

case2:

if(pop(L,e)){

cout<<"data"<

elsecout<<"popfailed"<

break;

case3:

if(GetTop(L,e)){

cout<<"headdata"<

elsecout<<"Getfailed"<

break;

case4:

if(StackEmpty(L)){

cout<<"stackisnotNULL"<

elsecout<<"stackisNULL"<

break;

case5:

cout<<"thisstacklengthis"<

break;

}

}

}

//Lstack.h

#include

#include

usingnamespacestd;

constintOK=1;

constintERROR=0;

typedefintSElemType;

typedefintStatus;

typedefstructLqStack{

SElemTypedata;

structLqStack*next;

}LqStack,*Lq_Stack;

StatusInintStack(Lq_Stack&L);//创建栈

Statuspush(Lq_Stack&L,SElemTypee);//入栈

Statuspop(Lq_Stack&L,SElemType&e);//出栈

StatusGetTop(Lq_StackL,SElemType&e);//得到栈顶数据

StatusStackEmpty(Lq_StackL);//判断栈是否为空

intStackLength(Lq_StackL);//计算栈的长度

StatusDestroyStack(Lq_Stack&L);//销毁栈

voidMenu(Lq_Stack&L,SElemTypee);//输出菜单选择执行的功能

Ø运行结果:

(2)应用栈的基本操作,实现数制转换(任意进制);;

Ø代码部分:

//Main.cpp

#include"SStack.h"

intmain(){

intnumber;

cout<<"要将数值转换为多少进制";

cin>>number;

conversion(number);

return0;

}

SStack.cpp

#include"SStack.h"

StatusInitStack(SStack&S){

//创建栈

S.dase=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));

if(!

S.dase)exit(ERROR);

S.top=S.dase;

S.stacksize=STACK_INIT_SIZE;

returnOK;

}

Statuspush(SStack&S,ElemTypee){

//入栈

if(S.top-S.dase>=S.stacksize){//栈满追加空间

S.dase=(ElemType*)realloc(S.dase,

(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(ElemType));

if(!

S.dase)exit(ERROR);

S.top=S.dase+STACK_INIT_SIZE;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

returnOK;

}

Statuspop(SStack&S,ElemType&e){

//出栈

if(S.top==S.dase)returnERROR;

e=*--S.top;

returnOK;

}

StatusStackEmpty(SStack&S){

//判断栈是否为空

if(S.dase==S.top)returnERROR;

returnOK;

}

voidconversion(intnumber){

//转换为e进制并输出

SStackS;

intN,e;

if(InitStack(S)){

cout<<"栈创建成功"<

}

cout<<"输入待转换的数:

";

cin>>N;

while(N){

push(S,N%number);

N=N/number;

}

while(StackEmpty(S)){

pop(S,e);

cout<

}

cout<

}

//SStack.h

#ifndefSSTACK_H

#defineSSTACK_H

#include

#include

usingnamespacestd;

constintSTACK_INIT_SIZE=100;

constintSTACKINCREMENT=10;

constintOK=1;

constintERROR=0;

typedefintStatus;

typedefintElemType;

typedefstruct{

ElemType*dase;

ElemType*top;

intstacksize;

}SStack;

StatusInitStack(SStack&S);//创建栈

Statuspush(SStack&S,ElemTypee);//入栈

Statuspush(SStack&S,ElemType&e);//出栈

StatusStackEmpty(SStack&S);//判断栈是否为空

voidconversion(intnumber);//转换为number进制并输出

#endif

Ø运行结果:

(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列)。

Ø代码部分:

A:

链式储存:

//Main.cpp:

#include"QNode.h"

intmain(){

LinkQueueQ;

InitQueue(Q);

Menu(Q);

DestroyQueue(Q);

return0;

}

//QNode.cpp:

#include"QNode.h"

StatusInitQueue(LinkQueue&Q){

//构造空队列

Q.front=Q.rear=(QueuePrt)malloc(sizeof(QNode));

if(!

Q.front)exit(ERROR);

Q.front->next=NULL;

returnOK;

}

StatusDestroyQueue(LinkQueue&Q){

//销毁队列Q

while(Q.front){

Q.rear=Q.front->next;

free(Q.front);

Q.front=Q.rear;

}

returnOK;

}

StatusEnQueue(LinkQueue&Q,QElemTypee){

//插入元素a为Q的新的队尾元素

QNode*p;

p=(QueuePrt)malloc(sizeof(QNode));

if(!

p)exit(ERROR);

p->data=e;p->next=NULL;

Q.rear->next=p;

Q.rear=p;

returnOK;

}

StatusDeQueue(LinkQueue&Q,QElemType&e){

//删除Q的队头元素,用e返回其值

QNode*p;

if(Q.front==Q.rear)returnERROR;

p=Q.front->next;

e=p->data;

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

if(Q.rear==p)Q.rear=Q.front;

free(p);

returnOK;

}

StatusQueueEmpty(LinkQueueQ){

//判断对是否为空

if(Q.front==Q.rear)returnERROR;

returnOK;

}

voidMenu(LinkQueue&Q){

//输出选择界面

intselect=1;

QElemTypee;

while(select){

cout<<"--------------------"<

cout<<"请选择以下功能:

"<

cout<<"--------------1,入队"<

cout<<"--------------2,出队"<

cout<<"--------------3,判断队空"<

cout<<"--------------0,退出程序"<

cout<<"请输入你的选择";

cin>>select;

switch(select){

case0:

break;

case1:

cout<<"输入入队数据"<

cin>>e;

if(EnQueue(Q,e)){

cout<<"入队成功"<

}

break;

case2:

if(DeQueue(Q,e)){

cout<

}

break;

case3:

if(QueueEmpty(Q))cout<<"此队不为空"<

elsecout<<"此队为空"<

break;

}

}

}

//QNode.h

#ifndefQNODE_H

#defineQNODE_H

#include

#include

usingnamespacestd;

constintOK=1;

constintERROR=0;

typedefintQElemType;

typedefintStatus;

typedefstructQNode{

QElemTypedata;

structQNode*next;

}QNode,*QueuePrt;

typedefstruct{

QueuePrtfront;

QueuePrtrear;

}LinkQueue;

StatusInitQueue(LinkQueue&Q);//构造空队列

StatusDestroyQueue(Lin

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

当前位置:首页 > PPT模板 > 国外设计风格

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

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